【问题标题】:QThread event loop and infinite work loopQThread 事件循环和无限工作循环
【发布时间】:2013-07-07 18:17:13
【问题描述】:

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

 >you should never ever block the event loop

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

【问题讨论】:

  • “它将阻塞信号槽的概念”并没有真正解析。无论如何,我在下面写了为什么这是一个坏主意,它与线程无关:“由于事件传递卡住,小部件不会自行更新,无法与小部件进行进一步交互,计时器不会触发和联网通信将变慢并停止。此外,许多窗口管理器会检测到您的应用程序不再处理事件并告诉用户您的应用程序没有响应“。在您的情况下,这仅意味着您的线程不会为该线程中的对象调度事件。

标签: multithreading qt


【解决方案1】:

一个循环总是可以被一个多次调用的函数替换(虽然它并不总是很方便)。创建一个插槽并将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()。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 如何在不阻塞事件循环的情况下正确暂停/恢复线程?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-21
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多