簡體   English   中英

將QThread移到另一個線程?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM