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 提供了乙個可以...