細說qt多執行緒(一)

2021-06-18 12:24:09 字數 2093 閱讀 9034

眾所周知,qt 建立多執行緒有主流的有3種方法:

1. 採用經典的qthread類。 2.實現qrunable 介面。3.採用qt並行框架qtconcurrent。

既然有三種方法,那麼哪種方式更好,在實際的專案中改採取哪種方式來實現?那麼我們不得不對3種方式做下對比。下面我將對每

一種方式,表達下我的淺見。

qthread 類

這是乙個經典得不能再經典的類,在很多語言中你可以看到他的身影。最最簡單的用法就是過載qthread類,實現其中的run方法,

通過執行start(),來啟動執行緒,於是這樣的**邊隨處可見:

class mythread : public qthread

;void mythread::run()

下面我們深入一點,將這個例子擴充套件下。 很多時候你可能要在建立qthread 類的時候,你需要給qthread類傳遞點東西進去,或者你想

在qthread 操作一下主線程裡面的資料, 於是你可能會有了下面的**:

class mythread : public qthread

; mythread::mythread(qobject* pare)

void mythread::run()

myobject obj;

mythread* mthd = new mythread(this);

mthd->start();

你一執行,就會有問題。你可能會看見qt告訴你不能操作m_obj 和通過m_pare 指標去操作。

為什麼會這樣,就得仔仔細細的分析下物件了, 先看看夠著函式傳入的obj物件,這個物件毫無疑問的是在主線程中建立的吧,那麼顯然他屬於主線程,

當 mthd->start() 後run函式會在另外乙個新開的執行緒中執行。mthd 是在主線程中建立的吧, 那麼mthd 就是主線程的物件,存在於主線程中,所以

m_obj,m_pare都在主線程中,他們都是主線程的物件。 而run函式,是新線中,所以在新執行緒中操作的是主線程中的物件,呼叫的也是主線程的方法。

這就跨執行緒操作了。(當然qt也提供跨執行緒呼叫的方法qmetamethod::invoke())。

上述情況可以通過movetothread將物件移動到同乙個執行緒中(推薦)

qthread mythread;

myobject obj;

具體的我一般喜歡這樣寫:

thread->connect(thread, signal(finished()), slot(deletelater()));將所有的任務放到另外乙個worker類中去實現,然後把worker移動到thread 執行緒中去,這樣 thread  和worker 處於同一執行緒

dowork()函式便在thread 執行緒裡面執行了,然後worker 的成員變數都屬於thread類,就不會出現跨執行緒的問題了!

用qt的,應該沒有人不用訊號和槽吧,很多時候我們也需要跨執行緒進行訊號槽操作,那麼我們會遇到乙個經典的問題,槽函式究竟會在哪個執行緒執行。

(注意:qobject的connect函式的第五個引數代表訊號與槽的連線模式,如果傳送訊號的物件和接受訊號的物件不再同乙個執行緒,第五個引數應該為

qt::directconnection連線方式)

連線方式區別

直接連線(direct connection)

佇列連線(queued connection)

自動連線:二者不在同一執行緒時,等同於佇列連線。

qt 多執行緒

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

Qt 多執行緒

qt 包含下面一些執行緒相關的類 qthread 提供了開始乙個新執行緒的方法 qthreadstorage 提供逐執行緒資料儲存 qmutex 提供相互排斥的鎖,或互斥量 qmutexlocker 是乙個便利類,它可以自動對 qmutex 加鎖與解鎖 qreadwriterlock 提供了乙個可以...

Qt多執行緒

今天學習qt的多執行緒,在學習多執行緒主要是兩個方面。一是多執行緒的基礎概念,二是多執行緒的同步,三是怎麼和主線程進行通訊。在這個主線程上面可以開始由qthread建立的物件的新的執行緒。這些由qthread建立的物件的新的執行緒之間的通訊,是通過使用含有互斥量,讀寫鎖,訊號量或者等待條件的共享變數...