1、QThreadPool類html
QThreadPool管理一組線程。它負責管理和回收單個QThread對象以減小程序中線程建立的開銷。每一個Qt應用程序都有一個全局的QThreadPool對象,可經過方法globalInstance()得到。爲了調用QThreadPool中的一個線程,須要提供一個從QRunnable繼承過來的類,並實現其中的run方法。而後建立一個該類的對象,傳遞給QThreadPool::start()方法。代碼片段以下:docker
默認狀況下, QThreadPool自動刪除QRunnable對象。使用QRunnable::setAutoDelete()方法能夠改變該默認行爲。QThreadPool支持在QRunnable::run方法中經過調用tryStart(this)來屢次執行相同的QRunnable。當最後一個線程退出run函數後,若是autoDelete啓用的話,將刪除QRunnable對象。在autoDelete啓用的狀況下,調用start()方法屢次執行同一QRunnable會產生競態,就避免這樣作。編程
那些在必定時間內會使用的線程將會過時。默認的過時時間是30秒。可經過setExpiryTimeout()方法來設置。設置一個負數的超時值表明禁用超時機制。方法maxThreadCount()能夠查詢可以使用的最大線程數,你也能夠設置最大的線程數。activeThreadCount反應的是當前正在被使用中的線程數個數。reserveThread函數保留某個線程爲外部使用,releaseThread釋放該線程,這樣就能夠被再次使用。多線程
2、QtConcurrent命名空間app
QtConcurrent命名空間裏提供了一些高級API,利用這些API能夠編寫多線程程序,而不用直接使用比較低級的一些類,如mutext,lock, waitcondition以及semaphore等。使用QtConcurrent命令空間的API編寫的程序會根據處理器的數目自動地調整線程的個數。QtConcurrent包含了用於並行列表處理的函數式編程,包含實現共享內存系統的MapReduce和FilterReduce, 以及管理GUI應用程序中異步計算的類。相關的類說明以下:異步
QtConcurrent::map()函數式編程 |
appliesa function to every item in aContainer, modifying the itemsin-place函數 |
QtConcurrent::mapped()this |
islike map(), except that it returns a new container with themodificationsspa |
islike mapped(), except that the modified results are reduced orfolded into a single result. |
|
litems from a container based on the result of a filter function. |
|
islike filter(), except that it returns a new container with thefiltered results |
|
islike filtered(), except that the filtered results are reduced orfolded into a single result |
|
runsa function in another thread. |
|
allowsiterating through results available via QFuture. |
|
allowsmonitoring a QFuture usingsignals-and-slots. |
|
isa convenience class that automatically synchronizes severalQFutures. |
代碼實例: