Qt執行緒總結

2021-10-23 06:47:47 字數 1510 閱讀 9494

qt對執行緒提供了支援,它引入了一些基本與平台無關的執行緒類、執行緒安全傳遞事件的方式和全域性qt庫互斥 量允許你從不同的執行緒呼叫qt的方法。

class

mythread

:public qthread

;void mythread::

run(

)//執行執行緒

}int

main()

qwidget *mywidget; 

qthread::postevent( mywidget, new qpaintevent( qrect(0, 0, 100, 100)))

;

上述**將非同步地使mywidget在它區域中重繪一塊100*100的正方形區域。

另外,還需要一些機制使得處於等待狀態的執行緒在給定條件下被喚醒。qwaitcondition 類就提供了這種功能。 執行緒等待的條件qwaitcondition滿足,qwaitcondition表明發生了什麼事情,它阻塞直到這件事情發生。

當發 生給定的事情時,qwaitcondition 將喚醒等待該事情的所有執行緒或者喚醒任意乙個被選中的執行緒。 (這和posix執行緒條件變數具有相同功能,是unix上的一種實現。)

#include

#include

// 全域性條件變數 qwaitcondition mycond;

// worker類實現

class

worker

:public qpushbutton,

public qthread

public slots:

void

slotclicked()

protected

:void

run(

)//過載run函式 }}

;int

main

(int argc,

char

**ar** )

(1)在持有qt庫互斥量時不要做任何阻塞操作。這將凍結事件迴圈。

(2) 確認你鎖定乙個遞迴qmutex的次數等於解鎖的次數,不能多也不能少。

(3)在呼叫除了qt容器和工具類外的任何東西之前鎖定qt應用程式互斥量。

(5)小心沒有被設計成執行緒安全的qt類,例如,qptrlist的api介面不是執行緒安全的,並且如果不同的線 程需要遍歷乙個qptrlist,它們應該在呼叫qptrlist::first()之前鎖住,在到達終點後解鎖。

(7)和上面很相似,只在gui執行緒中使用qnetwork類。因為所有的qnetwork類都是非同步的,沒必要把 qsocket用在多執行緒中。

(9)在你的應用程式中,不要把普通的qt庫和支援執行緒的qt庫混合使用。這意味著如果你的程式使用了支 持執行緒的qt 庫,你就不能連線普通 的qt庫、動態的載入普通qt庫或者動態地連線其它依賴普通qt庫的庫 或者外掛程式。在一些系統上,這樣做會導致qt庫中使用的靜態資料崩潰。

QT 執行緒使用總結

解決槽函式響應過程中遇到的阻塞問題 子類化qthread 子類化qobject 1 槽函式相應之前,一定要對操作的物件進行判斷,如果啟動執行緒需要判斷執行緒是否在執行 running 啟動定時器就要判斷定時器是否工作 active 2 兩種方式在開啟執行緒的時候有所不同,第一種由於重寫run函式,因...

qt 多執行緒

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

Qt 多執行緒

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