博客地址已更改,文章數量較多不便批量修改,若想訪問源文請到 coologic博客 查閱,網址:www.coologic.cn
如本文記錄地址為 techieliang.com/A/B/C/ 請改為 www.coologic.cn/A/B/C/ 即可查閱
版權聲明:若無來源注明, Techie亮博客文章均為原創。 轉載請以鏈接形式標明本文標題和地址:
本文標題:Qt多線程-總結QThread-QThreadPool-QtConcurrent 本文地址: http://techieliang.com/2017/12/616/
1. 總結
QThread:Qt提供的最基礎的線程類,一個對象管理一個線程,自己維護線程啟動停止,創建銷毀,當然也能基於此類自己建立一個線程池
QThreadPool:Qt提供的基於QThread實現的線程池,只需要提供給線程池“任務”即可,每一個“任務”需要繼承QRunnable,pool還貼心的幫忙在運行完成后釋放內存。只不過runnable不支持信號槽,可以做多重繼承QObject即可。
QtConcurrent:並行計算的高級API,用起來很方便,完全不需要想線程的問題,全都是靜態函數,可以運行自定義函數也提供了對容器的操作函數。
相關博客:
Qt多線程-QThread
QThread安全的結束線程
Qt多線程-QThreadPool線程池與QRunnable
Qt多線程-QtConcurrent並行運算高級API
2. 詳細對比
2.1. Qt事件處理
只有QThread支持。但是其他兩個可以用QApplication::postEvent發出事件
2.2. Qt信號槽
QThread完全支持,QThreadPool的QRunnable可以通過多重繼承支持
Concurrent提供的map/filter函數可以利用QFutureWatcher,使用此方式可用信號控制線程,但仍然無發通過信號槽對線程的數據做修改
run就完全與信號槽無緣了,畢竟調用的只是一個函數
2.3. 線程優先級
這個優先級設置以后不一定有效,要看系統
QThread完全支持,可以用setPriority函數
2.4. 其他
Concurrent所有函數都支持QFuture,同時Concurrent支持指定QThreadPool
3. 使用
- 只進行一次運行,或者調用不頻繁不需要長時間開着線程,也不需要數據交互,直接Concurrent省事,畢竟只需要一行,也不需要定義什么類。但如果不希望包含QT += Concurrent,那就用線程池吧。
- 單次不頻繁,需要數據交互,三個都能用,對於Concurrent雖然沒有信號槽但是可以自定義函數參數,注意線程安全即可。
- 頻繁調用,一定不要重復的創建銷毀線程,可以用線程池
- 長時間在幕后運行,一般這樣的線程總要有數據交互的,建議直接QThread,主要是QThread還支持事件處理,能做的事情會很多。
