QThreadPool Class的翻譯

QThreadPool Class的翻譯

**QThreadPool 類用來管理QThread集。**QthreadPool 管理和循環調用QThread對象,這樣多線程處理中可以減少資源的消耗。每一個Qt應用程序都有一個全局的QThreadPool對象,它可是通過globalInstance()來獲取。

創建QThreadPool 線程,需要子類化QRunnable,重寫run()虛函數。然後創建一個類的對象,然後將它移交到QThreadPool::start().

在這裏插入圖片描述
QThreadPool 默認會自動刪除QRunnable。使用QRunnale::setAutoDelete()來改變auto-deletion 標誌。

QThreadPool 通過tryStart(this)(與QRunable::run()一併),支持多次執行QRunable。如果autoDelete 使能,當run()函數中的最後一個線程退出時,QRunnable 會快速刪除。如果autoDelete 使能,在同一個QRunnable 多次調用start(),會建立一個多個線程競爭的情形,這是不值得推薦的。

一段時間內,沒有被使用的線程將會失效。默認的失效時間是30000微秒(30秒)。這個默認時間可以同setExPiryTimeout()函數來設置。如果設置的時間是一個負數,將會是超時的機制失效。

調用maxThreadCount()來查詢最大支持的線程數。如果需要,可以通過調用setMaxThreadCount()函數來改變最大線程數。可以通過QThread::idealThreadCount()方法來查看默認的最大線程數。通過調用activeThreadCount()函數來獲取當前活動的線程數。

reserveThread()函數會保留一個線程共外部使用。當你在處理線程的時候,使用releaseThread(),以便該線程可以重複使用。本質上,這兩個函數會增減當前活動的線程數。當計算線程的耗時上,這個兩個函數還是很實用的。

需要注意的是,QThreadPool 是更低一層的類用來管理線程。可以查閱更高一層的類Qt Concurrent 模型。

該類的屬性介紹:

activeThreadCount:當前線程池裏的活動線程。

expiryTimeout:超時時間。
請注意:設置expiryTimeout 對已經存在的的線程是沒有效用的。只有對新建的線程纔有用。
推薦在一開始創建線程池的時候,在調用start()函數前就設置好expiryTimeout。

maxThreadCount:當前線程池的最大線程數。

stackSize:線程池工作線程的棧大小。

成員函數:
QThreadPool::~QThreadPool()
銷燬線程池。知道所有的runnables都已經完成,該函數將一直處在阻塞狀態。

QThreadPool *QThreadPool::globalInstance()
返回全局線程池。

void QThreadPool::releaseThread()
釋放之前一個被保留的線程。

void QThreadPool::reserveThread()
保留一個線程,忽略activeThreadCount()和maxThreadCount

void QThreadPool::start(QRunnable *runnable, int priority = 0)
保留一個線程並使用它運行runnable,除非此線程將使當前線程數超過maxThreadCount()。在這種情況下,runnable被添加到運行隊列中。priority參數可用於控制運行隊列的執行順序。

bool QThreadPool::tryStart(QRunnable *runnable)
試圖保留線程以運行runnable。

如果在調用時沒有線程可用,則此函數不執行任何操作並返回false。否則,使用一個可用線程立即運行runnable,此函數返回true。

bool QThreadPool::tryTake(QRunnable *runnable)
嘗試從隊列中刪除指定的runnable(如果尚未啓動)。如果runnable尚未啓動,則返回true,runnable的所有權將轉移到調用方(即使runnable->autoDelete()==true)。否則返回false。

bool QThreadPool::waitForDone(int msecs = -1)
等待所有線程退出並從線程池中刪除所有線程的時間最長爲毫秒。如果刪除了所有線程,則返回true;否則返回false。如果msec爲-1(默認值),則忽略超時(等待最後一個線程退出)。

本篇翻譯完畢,如有錯誤的地方,懇請讀者們多多指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章