淺淺淡淡 Qt 線程類
Qt 線程類是本文介紹的內容,Qt對線程的支持已經(jīng)有很多年了(發(fā)布于2000年九月22日的Qt 2.2引入了QThread類),Qt 4.0版本的release則對其所有所支持平臺默認地是對多線程支持的。(當然你也可以關掉對線程的支持,參見這里)?,F(xiàn)在Qt提供了不少類用于處理線程,讓你我們首先預覽一下:
QThread
QThread 是Qt中一個對線程支持的核心的底層類。每個線程對象代表了一個運行的線程。由于Qt的跨平臺特性,QThread成功隱藏了所有在不同操作系統(tǒng)里使用線程的平臺相關性代碼。為了運用QThread從而讓代碼在一個線程里運行,我們可以創(chuàng)建一個QThread的子類,并重載QThread::run() 方法:
- class Thread : public QThread {
- protected: void run() {
- }
- };
接著,我們可以使用:
- class Thread : public QThread { protected: void run() {
- }
- };
來真正的啟動一個新的線程。 請注意,Qt 4.4版本之后,QThread不再支持抽象類;現(xiàn)在虛函數(shù)QThread::run()實際上是簡單調用了QThread::exec(),而它啟動了線程的事件循環(huán)。(更多信息見后文)
QRunnable 和 QThreadPool
QRunnable [doc.qt.nokia.com] 是一種輕量級的、以“run and forget”方式來在另一個線程開啟任務的抽象類,為了實現(xiàn)這一功能,我們所需要做的全部事情是派生QRunnable 類,并實現(xiàn)純虛函數(shù)方法run()
- class Task : public QRunnable {
- public: void run() {
- }
- };
事實上,我們是使用QThreadPool 類來運行一個QRunnable 對象,它維護了一個線程池。通過調用QThreadPool::start(runnable) ,我們把一個QRunnable 放入了QThreadPool的運行隊列中;只要線程是可見得,QRunnable 將會被拾起并且在那個線程里運行。盡管所有的Qt應用程序都有一個全局的線程池,且它是通過調用 QThreadPool::globalInstance()可見得,但我們總是顯式地創(chuàng)建并管理一個私有的QThreadPool 實例。請注意,QRunnable 并不是一個QObject類,它并沒有一個內置的與其他組件顯式通訊的方法。你必須使用底層的線程原語(比如收集結構的枷鎖保護隊列等)來親自編寫代碼。
QtConcurrent
QtConcurrent 是一個構建在QThreadPool之上的上層API,它用于處理最普通的并行計算模式:map [en.wikipedia.org], reduce [en.wikipedia.org], and filter [en.wikipedia.org] 。同時,QtConcurrent::run()方法提供了一種便于在另一個線程運行一個函數(shù)的方法。不像QThread 以及QRunnable,QtConcurrent 沒有要求我們使用底層的同步原語,QtConcurrent 所有的方法會返回一個QFuture 對象,它包含了結果而且可以用來查詢線程計算的狀態(tài)(它的進度),從而暫停、繼續(xù)、取消計算。QFutureWatcher 可以用來監(jiān)聽一個QFuture 進度,并且通過信號和槽與之交互(注意QFuture是一個基于數(shù)值的類,它并沒有繼承自QObject).
功能比較
小結:Qt 線程類的內容介紹完了,希望本文對你有所幫助,新昂要獲取更多的內容請參考編輯推薦。