2013-05-08 39 views
1

我有一个类包含QThread。在这个类的初始化函数中,线程应该被启动。这工作正确。在线程中,我有一个while(bool certainCondition){}这个certainCondition应通过信号/插槽连接进行更改。QThreads插槽和信号中断

问题是,在运行期间,信号/插槽未打开。

+0

你可以发布一些代码来显示'信号/插槽没有打开'吗? – spiritwolfform 2013-05-08 14:03:59

+4

你只需要等待一个特定的条件?我认为[QWaitCondition](http://qt-project.org/doc/qt-4.8/qwaitcondition.html)在这里很有用。 – eraxillan 2013-05-08 14:06:21

回答

3

您没有在您的线程中运行事件循环,或者您在while循环中阻塞了很长时间。直到您将控制权归还给事件循环后才能调用您的插槽,已完成while循环后会发生

作为解决方法,您可以尝试在while循环中调用QCoreApplication::processEvents()

1

为了让信号/插槽能够跨线程工作,事件循环必须运行。
如果使用while循环,事件循环从不运行,因此不会收到信号。
这是你如何正常运行的事件循环:

void Thread::run() 
{ 
    ...do something 
    exec(); //<<this runs the event loop 
} 

现在,你的问题是,你直到某些条件得到满足想要连续运行一些代码。在上面的代码中,由于exec()调用,这不起作用。
有以下两种方式来解决(这取决于你想要在你的循环来实现的):

  1. 使用QTimer,即火灾让我们每5秒说,并调用执行你的重复代码插槽。

  2. 使用QWaitCondition检查是否满足某个条件;但是你不能使用信号和插槽;相反,你必须触发QWaitCondition。