我需要在一个线程中进行无限循环的工作。 在this article作者写道
>you should never ever block the event loop
因为它会阻止信号槽概念。如何在QThread
中使用事件循环加无限循环?
答案 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的事件循环。
答案 2 :(得分:0)
对QCoreApplication::processEvents的调用应该有效,但也许更好的解决方案是使用QThreadPool而不是强制线程继续运行。