我需要在一个线程中进行无限循环的工作。在这篇文章中,作者写道
>you should never ever block the event loop
因为它会阻塞信号槽的概念。如何在中使用事件循环和无限循环QThread
?
我需要在一个线程中进行无限循环的工作。在这篇文章中,作者写道
>you should never ever block the event loop
因为它会阻塞信号槽的概念。如何在中使用事件循环和无限循环QThread
?
循环总是可以替换为多次调用的函数(尽管它并不总是很方便)。创建一个插槽并将 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()
.
QThread 是线程“控制器”。它的事件循环不会因为您的 QObject 执行无限循环而阻塞。当然,除非您在 QThread 子类中实现该无限循环。
在您的情况下,您不必这样做。相反,只需在 QObject 子类中实现无限循环,然后使用QObject::moveToThread()将该 QObject 移动到线程。这样你的无限循环就不会阻塞 QThread 的事件循环。
而且,一如既往:关于如何真正使用 QThread 的规范文章。
对QCoreApplication::processEvents的调用应该可以工作,但也许更好的解决方案是使用QThreadPool而不是强制线程继续运行。