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

版權聲明:若無來源註明, Techie亮博客文章均爲原創。 轉載請以連接形式標明本文標題和地址:
本文標題:Qt多線程-總結QThread-QThreadPool-QtConcurrent     本文地址: http://techieliang.com/2017/12/616/

1. 總結

QThread:Qt提供的最基礎的線程類,一個對象管理一個線程,本身維護線程啓動中止,建立銷燬,固然也能基於此類本身創建一個線程池html

QThreadPool:Qt提供的基於QThread實現的線程池,只須要提供給線程池「任務」便可,每個「任務」須要繼承QRunnable,pool還貼心的幫忙在運行完成後釋放內存。只不過runnable不支持信號槽,能夠作多重繼承QObject便可。安全

QtConcurrent:並行計算的高級API,用起來很方便,徹底不須要想線程的問題,全都是靜態函數,能夠運行自定義函數也提供了對容器的操做函數。多線程

相關博客:函數

Qt多線程-QThread
QThread安全的結束線程
Qt多線程-QThreadPool線程池與QRunnable
Qt多線程-QtConcurrent並行運算高級APIpost

2. 詳細對比

2.1. Qt事件處理

只有QThread支持。可是其餘兩個能夠用QApplication::postEvent發出事件線程

2.2. Qt信號槽

QThread徹底支持,QThreadPool的QRunnable能夠經過多重繼承支持htm

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
相關文章
相關標籤/搜索