1

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

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

4

2 回答 2

3

您没有在线程中运行事件循环,或者您在 while 循环中阻塞了很长时间。在您将控制权返回给事件循环之前无法调用您的插槽,这将您完成 while 循环后发生。

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

于 2013-05-08T14:02:55.897 回答
1

为了让信号/槽跨线程工作,事件循环必须运行。
如果使用 while 循环,则永远不会运行事件循环,因此不会收到信号。
这是您通常运行事件循环的方式:

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

现在,您的问题是您希望连续运行一些代码,直到满足某些条件。在上面的代码中,这不起作用,因为exec()调用。
有两种可能解决这个问题(取决于你想在你的循环中实现什么):

  1. 使用 QTimer,假设每 5 秒触发一次,并调用一个执行重复代码的插槽。

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

于 2013-08-25T10:24:56.733 回答