Qt多線程-總結QThread-QThreadPool-QtConcurrent


博客地址已更改,文章數量較多不便批量修改,若想訪問源文請到 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還支持事件處理,能做的事情會很多。

 

轉載請以鏈接形式標明本文標題和地址: Techie亮博客 » Qt多線程-總結QThread-QThreadPool-QtConcurrent


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM