QThread事件循环和无限工作循环

时间:2013-07-07 18:17:14

标签: multithreading qt

我需要在一个线程中进行无限循环的工作。 在this article作者写道

 >you should never ever block the event loop

因为它会阻止信号槽概念。如何在QThread中使用事件循环加无限循环?

3 个答案:

答案 0 :(得分:4)

循环总是可以被多次调用的函数替换(尽管并不总是方便)。创建一个插槽并将QTimer连接到它。让函数进行迭代工作。

timer = new QTimer();
connect(timer, SIGNAL(timeout()), this, SLOT(iteration()));
timer->start(50); 

void MyClass::iteration() {
  if (!timer->isActive()) { return; }
  //do something
}

如果您想停止循环,请致电timer->stop()

答案 1 :(得分:2)

QThread是线程“控制器”。它的事件循环不会因为你的QObject执行无限循环而阻塞。当然,除非你在QThread子类中实现无限循环。

在您的情况下,您不必这样做。相反,只需在QObject子类中实现无限循环,然后将该QObject移动到具有QObject::moveToThread()的线程。这样你的无限循环就不会阻塞QThread的事件循环。

而且,一如既往:the canonical article on how to really use QThread

答案 2 :(得分:0)

QCoreApplication::processEvents的调用应该有效,但也许更好的解决方案是使用QThreadPool而不是强制线程继续运行。