QThread多執行緒程式設計經典案例分析

2021-07-14 06:59:56 字數 1334 閱讀 4417

傳統的圖形介面應用程式都只有乙個執行緒執行,並且一次執行乙個操作。如果使用者呼叫乙個比較耗時的操作,就會凍結介面響應。

乙個解決方法是按照事件處理的思路:

另外乙個解決方法是:採用多執行緒。、

qt qthread多執行緒程式設計的方法一直有個爭議,就是bradley t. hughes:you』re doing it wrong 歸納為3中方法優劣問題:

方法(1): 

1. 不使用事件迴圈。這是官方的 manual 、example 以及相關書籍中都介紹的一種的方法。 

a. 子類化 qthread 

b. 過載 run 函式,run函式內有乙個 while 或 for 的死迴圈 

c. 設定乙個標記為來控制死迴圈的退出。

這裡的run函式自己執行了乙個迴圈,不需要事件迴圈機制了。

方法(2):

這種方法也是bradley t. hughes極力批判的 a. 子類化 qthread, b. 過載 run 使其呼叫 qthread::exec() c. 並為該類定義訊號和槽,這樣一來,由於槽函式並不會在新開的 thread 執行,很多人為了解決這個問題在建構函式中呼叫 movetothread(this); 

而爭論和不解正是這樣的一條語句造成的。 

bradley t. hughes 給出說明是: qthread 應該被看做是作業系統執行緒的介面或控制點,而不應該包含需要在新執行緒中執行的**。需要執行的**應該放到乙個qobject的子類中,然後將該子類的物件movetothread到新執行緒中。

方法(3): 

在qt4.3(包括)之前,run 是虛函式,必須子類化qthread來實現run函式。而從qt4.4開始,qthreads-no-longer-abstract

,run 預設呼叫 qthread::exec() 。這樣一來不需要子類化 qthread 了,只需要子類化乙個 qobject 就夠了,這正是被 bradley t. hughes推薦的方法。

方法如下

qthread thread; 

object obj;

dummy dummy;

obj.movetothread(&thread);

qobject::connect(&dummy, signal(sig()), &obj, slot(slot()));

thread.start();

所以,方法(1)和方法(3)是正確的qt qthread多執行緒程式設計方法,方法(2)用的最多,但只是三人成虎,一種不恰當的用法

QThread多執行緒程式設計經典案例分析

傳統的圖形介面應用程式都只有乙個執行緒執行,並且一次執行乙個操作。如果使用者呼叫乙個比較耗時的操作,就會凍結介面響應。乙個解決方法是按照事件處理的思路 另外乙個解決方法是 採用多執行緒。qt qthread多執行緒程式設計的方法一直有個爭議,就是bradley t.hughes you re doi...

QThread多執行緒程式設計分析

傳統圖形介面應用程式都只有乙個執行緒執行,並且一次執行乙個操作。如果使用者呼叫乙個比較耗時的操作,就會凍結介面響應。乙個解決方法是按照事件處理的思路 呼叫 或來強迫事件迴圈進行,但是這種做法是有潛在風險的。按照 可能會引起遞迴,導致棧溢位崩潰的說法,當主線程在某個槽函式裡正在執行 processev...

Qt多執行緒開發 QThread

件 class mythread public qthread mythread virtual void run cpp檔案 void mythread run 件 class mythread public qthread mythread virtual void run class move...