在Qt中调用子线程中的函数?
我有一个主线程在不同时间调用子线程函数,但我不确定这是否是在 Qt 中执行此操作的正确方法。下面的代码有什么问题并寻找更好的替代方案
有一个主线程无限运行时每个主线程释放锁子线程都会完成一项工作。
#include <QtCore/QCoreApplication>
#include <QSemaphore>
#include <QThread>
QSemaphore sem(0);
class Background : public QThread
{
protected:
void run()
{
for(;;)
{
sem.acquire(1);
qDebug("Child function ran");
}
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Background child;
child.start();
qDebug("Main running");
qDebug("release a lock");
sem.release(1);
qDebug("Do somework in main");
//call child
sem.release(1);
sem.release(1);
return a.exec();
}
I have a main thread that invokes a child thread function at different times but I am not sure whether that is right way of doing it in Qt.What is wrong with the below code and looking for better alternative
There is a main thread running infinitly when ever main thread releases the lock child does a piece of work.
#include <QtCore/QCoreApplication>
#include <QSemaphore>
#include <QThread>
QSemaphore sem(0);
class Background : public QThread
{
protected:
void run()
{
for(;;)
{
sem.acquire(1);
qDebug("Child function ran");
}
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Background child;
child.start();
qDebug("Main running");
qDebug("release a lock");
sem.release(1);
qDebug("Do somework in main");
//call child
sem.release(1);
sem.release(1);
return a.exec();
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
编辑:修改整个帖子以涵盖基础知识。
Background.h
:main.cpp
:示例输出:
确保在头文件上运行 moc,qmake 和 cmake 都支持创建 makefile。
这是我用来构建代码的
CMakeLists.txt
文件:Edit: rework of entire post to cover basics as well.
Background.h
:main.cpp
:Sample output:
Be sure you run moc on your header files, qmake and cmake both support creating your makefiles.
Here is the
CMakeLists.txt
file I used to build the code:实际上,您当前解决该问题的方法是一个相当不错的技巧。
如果您喜欢以“更干净”的方式执行此操作,则应该在工作线程中启动事件循环。然后工作线程将能够接收来自主线程的信号。您可以从主线程调用子线程中的函数(使用信号/槽机制)来触发操作。
请参阅此处了解更多详细信息:
http://doc.trolltech.com/4.2/threads。 html#per-thread-event-loop
(提示:关键思想是在工作线程中创建接收对象;然后它的槽将在该线程中处理;或者您可以使用 MoveToThread() 函数)
Actually your current solution to the problem is quite a nice hack.
If you prefer to do it in a "cleaner" fashion, you should start an event loop in your worker thread. Then the worker thread will be able to receive signals from the main thread. You could call a function in the child thread (using signal/slot mechanism) from the main thread to trigger operation.
See here for more details:
http://doc.trolltech.com/4.2/threads.html#per-thread-event-loop
(Hint: The key idea is that you create the receiving object in the worker thread; then its slots will be processed in that thread; or you could use MoveToThread() function)
看来您可能想为此使用信号,以适应正常的 Qt 风格。查看这个问题;那里接受的答案似乎也符合你的问题。
It seems that you might want to use a signal for that, to fit in with the normal Qt style. Check out this question; the accepted answer there seems to match your question too.