[英]Move a QThread to another thread?
由於某些原因,我需要這樣做:
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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.