将QThread移动到另一个线程?

时间:2015-05-16 03:28:27

标签: c++ multithreading qt

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

class A: Public QThread
class B: class A

现在可以做到:

B myclass;
myclass.moveToThread(workerThread);

2 个答案:

答案 0 :(得分:0)

讨论设计时,覆盖线程类时效果不佳。据说我们应该将一些QObject派生的处理程序移动到QThread(moveToThread)的线程。直接从QThread导出并不是大多数时候都是合理的。有一篇很好的文章解释了为什么你应该移动另一个对象并覆盖QThread。 请阅读thisthis 。我只能 想到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();

答案 1 :(得分:0)

  

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

class A: Public QThread
class B: class A

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

QThread可以被认为是一个线程控制器,而不是线程本身。

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

请注意,QThread的实例与创建它的线程 ("It is important to remember that a QThread instance lives in the old thread that instantiated it") 具有亲缘关系。此设计允许原始线程通过信号和插槽与新的QThread实例进行通信。出于这个原因,从QThread继承,从它派生另一个类并将其移动到自身并不是一个好主意!