5

我需要在一个线程中进行无限循环的工作。在这篇文章中,作者写道

 >you should never ever block the event loop

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

4

3 回答 3

4

循环总是可以替换为多次调用的函数(尽管它并不总是很方便)。创建一个插槽并将 a 连接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().

于 2013-07-08T09:50:42.123 回答
3

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

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

而且,一如既往:关于如何真正使用 QThread 的规范文章

于 2013-07-07T18:37:32.293 回答
1

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

于 2013-07-07T18:34:47.943 回答