【问题标题】:Qt: Worker thread that has slots and emitters on main threadQt:在主线程上有槽和发射器的工作线程
【发布时间】:2011-07-27 04:53:33
【问题描述】:

假设我想要一个工作线程,它具有用于从主应用程序线程发出的信号的插槽。

  1. 该工作线程的“::run()”方法看起来如何?显然我需要某种循环,否则线程将立即终止。我希望它坚持下去,以便它可以处理传入的插槽。那个循环会是什么样子?相当于睡眠和泵信息的东西?泵如何?

  2. 我是否需要“MoveToThread()”所有将传递到线程槽的对象,以便在工作线程的上下文中完成槽的处理?

谢谢。

【问题讨论】:

标签: qt


【解决方案1】:

做了更多的挖掘。 QThread::run 的默认实现调用“exec”,即消息循环。所以那里不需要额外的工作。在我的 QThread 的构造函数中,我添加了这个:

this->start();
QObject::moveToThread(this);

因此,我的线程在构造时就开始了,线程外针对线程槽的所有信号都在我的线程上下文中执行。

【讨论】:

  • 不! :) 那是使用 QThreads 的误导和最重复的方式。简短的回答(与 QThread 文档相反)。不要继承 QThread。子类 QObject 来做你想做的工作并使用 moveToThread() 将它移动到 QThread 的实例。
  • 有趣的方法。它有什么好处?另外,使用上述方法是否有潜在的灾难?
  • 当我尝试将 QThread 子类化并在构造函数中将其移动到自己的线程中的方法时,我很难正确清理它们。特别是,您不能调用 deleteLater()。当引入信号和槽时,事物的执行顺序还有其他问题。尽管它通常看起来工作正常,但它完全是一团糟。
  • 为了进一步保证,这篇 Qt Labs 文章暗示关于 QThread 使用的消息正在第二个屏幕截图中传播:) labs.qt.nokia.com/2011/06/15/…
  • 感谢您提供详细信息。我将在我的代码中为简单地提交给 QThread 实例的 QObject 派生的“worker”类进行这些更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
  • 2017-07-30
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多