QT高階程式設計技巧(二) 編寫多執行緒和併發應用

2021-08-15 09:57:53 字數 1897 閱讀 7254

學習qt多執行緒程式設計之前,有必要先熟悉事件迴圈的概念。先看乙個單執行緒介面程式的主函式**:

int main(int argc, char* argv)

在程式初始化完成後,主線程進入main()函式開始執行應用**。一般地,我們在主線程上構建介面物件,然後進入事件迴圈以處理控制項繪製、使用者輸入、系統輸出等訊息。這就是我們通常說的事件驅動模型。

主線程承擔著使用者互動的重任,當在主線程上執行費時的**時,就會影響使用者的正常操作。所以我們常把一些費時費力的計算工作移出主線程,開闢新的執行緒來執行之。

qthread是qt中用於執行緒管理的類,呼叫乙個qthread物件的start()方法時,會建立乙個新的執行緒並執行它的run()方法。預設地,run()會呼叫exec()方法進入自己的訊息迴圈中。如下圖所示:

上圖中有主線程、工作執行緒都是執行事件迴圈,並且注意到主線程內部含有thr、w、objs這些qobject物件(這些物件都是在主線程上建立的)。主線程的事件迴圈負責檢測這些物件是否有訊息要處理,有的話則呼叫物件的slot方法。可以使用qobject::movetothread方法將某個物件移到其他執行緒中,譬如:

class worker : public qobject 

void somefunc()

如果在主線程上呼叫somefunc(),則workerthread和worker在建立後都是關聯在主線程上,當呼叫worker->movetothread()後,worker物件關聯到了新的執行緒中,如圖所示:

假定我們在mainwindow上宣告了乙個workssignal()訊息,在worker物件上宣告和定義了handleworks()的槽,將workssignal和handleworks連線起來的方式有:

1. qt::autoconnection - (預設)如果訊息物件和槽物件關聯在同一執行緒下,則使用qt::directconnection方式;否則的話,像mainwindow和worker兩個關聯在不同執行緒的物件,將採用qt::queuedconnection的方式。

2. qt::directconnection - 傳送訊息的時候將直接呼叫槽物件的槽方法。注意這裡的槽方法是在傳送訊息的執行緒上執行的,如果該槽方法是非執行緒安全的話會有問題的。

3. qt::queuedconnection - 傳送執行緒在傳送訊息後將繼續執行,槽物件關聯的執行緒在事件迴圈時會檢測到該訊息,並呼叫相應的槽方法。

4. qt::blockingqueuedconnection - 在主線程傳送workssignal訊息後,將阻塞直到在工作執行緒檢測到該訊息並執行worker->handleworks()後恢復。

5. qt::uniqueconnection - 可以和上面4個方式聯並(或操作),提示該連線是獨一的。提示不能有相同的連線(訊息物件和槽物件,訊息和槽都相同)出現。

這裡特別提醒讀者,一般地我們不建議將qthread物件movetothread到它執行的執行緒上。原因是qthread是設計成乙個管理執行緒的類,我們不應該在工作執行緒上管理工作執行緒,對吧。關於更多的技術細節,我不想多講了,因為本系列的博文旨在共享經驗技巧,而非翻譯一些文件。

void workerthread::run()

);  tmr.start(500); // 500毫秒計時

exec(); // 進入事件迴圈

}

關於多線執行緒的程式設計談論到此,望能起拋磚引玉的效果。在實際的專案,可以參考下面的文件設計多執行緒或併發的應用:

* qtconcurrent: 

* thread support in qt: 

Qt高階程式設計技巧(二) 編寫多執行緒和併發應用

學習qt多執行緒程式設計之前,有必要先熟悉事件迴圈的概念。先看乙個單執行緒介面程式的主函式 int main int argc,char ar 在程式初始化完成後,主線程進入main 函式開始執行應用 一般地,我們在主線程上構建介面物件,然後進入事件迴圈以處理控制項繪製 使用者輸入 系統輸出等訊息。...

Qt 多執行緒程式設計

qt 多執行緒程式設計 qt通過三種形式提供了對執行緒的支援。它們分別是,一 平台無關的執行緒類,二 執行緒安全的事件投遞,三 跨執行緒的訊號 槽連線。這使得開發輕巧的多執行緒 qt程式更為容易,並能充分利用多處理器機器的優勢。多執行緒程式設計也是乙個有用的模式,它用於解決執行較長時間的操作而不至於...

Qt 多執行緒程式設計

qt 多執行緒程式設計 qt通過三種形式提供了對執行緒的支援。它們分別是,一 平台無關的執行緒類,二 執行緒安全的事件投遞,三 跨執行緒的訊號 槽連線。這使得開發輕巧的多執行緒 qt程式更為容易,並能充分利用多處理器機器的優勢。多執行緒程式設計也是乙個有用的模式,它用於解決執行較長時間的操作而不至於...