出于某种原因,我需要这样做:
class A: Public QThread
class B: class A
现在可以做到:
B myclass;
myclass.moveToThread(workerThread);
答案 0 :(得分:0)
讨论设计时,覆盖线程类时效果不佳。据说我们应该将一些QObject派生的处理程序移动到QThread(moveToThread)的线程。直接从QThread导出并不是大多数时候都是合理的。有一篇很好的文章解释了为什么你应该移动另一个对象并覆盖QThread。 请阅读this和this 。我只能 想到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继承,从它派生另一个类并将其移动到自身并不是一个好主意!