眾所周知,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建立的物件的新的執行緒之間的通訊,是通過使用含有互斥量,讀寫鎖,訊號量或者等待條件的共享變數...