将一个QThread移动到另一个线程



出于某种原因,我需要做:

class A: Public QThread
class B: class A

现在可以这样做:

B myclass;
myclass.moveToThread(workerThread);

出于某种原因,我需要做:

class A: Public QThread
class B: class A

除非你打算改变Qt管理线程的方式,我相信你可以避免这种设计。

QThread可以看作是一个线程控制器,而不是线程本身。

正如在这些论坛中多次提到的那样,使用QThread的更好的设计是创建一个从QObject派生的对象,并将其移动到QThread对象中。

请注意,QThread的实例与创建它的线程有关联("重要的是要记住,QThread实例存在于实例化它的旧线程中")。这种设计允许原始线程通过信号和插槽与新的QThread实例通信。由于这个原因,从QThread继承,从它派生另一个类并将其移动到自身并不是一个好主意!

讨论设计,重写线程类是不好的。据说我们应该移动一些qobject派生的处理程序到QThread (moveToThread)的线程中。在大多数情况下,直接从QThread派生是不合理的。有一篇很好的文章解释了为什么应该移动另一个对象并覆盖QThread。请阅读这个和这个。我可以只能为QThread::exec考虑一个特殊的事件循环重写,这对QThread重写的解决方案有一定意义。

如你所愿:你可以那样做。类B应该重写run()。类B也应该有,例如onStart和onFinish,使它有用。

B::B()
{
  moveToThread(this);
}
void B::run() // override
{
  connect(this, SIGNAL(started()), this, SLOT(onStart()));
  connect(this, SIGNAL(finished()), this, SLOT(onFinish()));
  exec();
}
// make sure to create thread object which is not destructed while leaving the scope of the function that creates it
B* pBThreadObj = new B(this);
pBThreadObj->start();

最新更新