Qt多執行緒

2021-07-26 00:27:01 字數 1195 閱讀 1123



1.qthread類

qthread類並不是代表乙個新的執行緒,而是qt提供的乙個介面,用於控制乙個子執行緒。每個qthread的例項就代表著對乙個新執行緒的乙個控制類。對於第一次使用qt多執行緒的人,或許就會很迷惑很不適應。

qthread提供乙個公共槽介面--start(),當你有乙個qthread的例項例如

qthread q_thread

當你呼叫q_thread.start()時,q_thread控制的子執行緒就會開始執行,執行的入口就是qthread類的virtual protected 函式 qthread::run(),此時,run()裡面的語句都是在新起的乙個執行緒裡執行,預設qt自帶的run()實現就是qthread::exec(),表示開始qthread類的訊息迴圈。exec()執行後,q_thread就能接受到訊號(如果有連線訊號的話),執行響應的槽。

重點來了,run()裡面的語句是在新起的執行緒執行的,而q_thread收到訊號,執行相應槽裡面的語句,卻是由qthread所在的執行緒執行的。包括繼承qthread類的子類以及其訊號槽。  

例如乙個qthread的子類:

class mythread : public qthread

;void mythread::run()

乙個主對話方塊類,裡面宣告乙個mythread變數

class mainwindow : public qmainwindow ;

當我們在mainwindow裡呼叫q_mythread.start()時, mythread::run()開始執行,假設主線程是thread1,新起的執行緒是thread2,

int i = 0;i++;都是在thread2裡執行。接著exec()後,mythread的事件迴圈開始了。

我們先

connect(this,signal(mainwindowsigna()),&q_mythread,slot(mythreadslot()),qt::queuedconnection);

當mainwindow裡 emit mainwindowsignal()時,mythread的mythreadslot()會執行,你會發現,mythreadslot()執行的執行緒並不是我們想的thread2,而是thread1,因為q_thread在mainwindow中,mainwindow就在主線程thread1中。那麼我們如何才能在讓我們寫的**在thread2執行呢,其中乙個方法便是改寫run(),函式。

qt 多執行緒

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

Qt 多執行緒

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

Qt多執行緒

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