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

5

我需要在线程中创建无限循环的工作。在这篇文章中,作者写道:

 >you should never ever block the event loop

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


“它将阻止信号槽的概念”并不是很好理解。无论如何,我在下面写了为什么这是一个坏主意,并且与线程几乎没有关系:“事件传递被卡住后,小部件将无法更新自己,无法进行任何与小部件的交互,计时器将无法触发,网络通信将变慢并停止。此外,许多窗口管理器将检测到您的应用程序不再处理事件,并告诉用户您的应用程序未响应”。在您的情况下,这意味着您的线程将无法为驻留在该线程中的对象分派事件。 - peppe
3个回答

5

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

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

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


3
如何正确地暂停/恢复线程,而不阻塞事件循环? - user14416

3

循环总是可以用被多次调用的函数来替代(尽管这并不总是方便)。创建一个插槽并将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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接