QThreadPool 類

The QThreadPool 類管理一批 QThread。 更多...

頭: #include <QThreadPool>
qmake: QT += core
Since: Qt 4.4
繼承: QObject

注意: 此類的所有函數 綫程安全 .

特性

公共函數

QThreadPool (QObject * parent = Q_NULLPTR)
~QThreadPool ()
int activeThreadCount () const
void clear ()
int expiryTimeout () const
int maxThreadCount () const
void releaseThread ()
void reserveThread ()
void setExpiryTimeout (int expiryTimeout )
void setMaxThreadCount (int maxThreadCount )
void start (QRunnable * runnable , int priority = 0)
bool tryStart (QRunnable * runnable )
bool tryTake (QRunnable * runnable )
bool waitForDone (int msecs = -1)

靜態公共成員

QThreadPool * globalInstance ()

額外繼承成員

詳細描述

The QThreadPool 類管理一批 QThread。

QThreadPool 管理和迴收單個 QThread 對象,以幫助使用綫程的程序縮減綫程創建開銷。每個 Qt 應用程序擁有一個全局 QThreadPool 對象,可以訪問通過調用 globalInstance ().

要使用某一 QThreadPool 綫程,子類 QRunnable 和實現 run() 虛函數。然後創建該類的對象並把它傳遞給 QThreadPool::start ().

class HelloWorldTask : public QRunnable
{
    void run()
    {
        qDebug() << "Hello world from thread" << QThread::currentThread();
    }
};
HelloWorldTask *hello = new HelloWorldTask();
// QThreadPool takes ownership and deletes 'hello' automatically
QThreadPool::globalInstance()->start(hello);
					

QThreadPool 刪除 QRunnable 默認情況下是自動的。使用 QRunnable::setAutoDelete () 以改變自動刪除標誌。

QThreadPool 支持執行同一 QRunnable 多次通過調用 tryStart (this) 從 QRunnable::run ()。若 autoDelete 被啓用 QRunnable 會被刪除當最後一個綫程退齣 run 函數時。調用 start () 多次采用同一 QRunnable 當啓用 autoDelete 時會創建競爭條件且不推薦。

在一定時間內未使用綫程將過期。默認過期超時為 30000 毫秒 (30 秒)。可以改變這使用 setExpiryTimeout ()。設置負值過期超時,將禁用過期機製。

調用 maxThreadCount () 以查詢要使用的最大綫程數。若需要,可以改變限製采用 setMaxThreadCount ()。默認 maxThreadCount () 是 QThread::idealThreadCount ()。 activeThreadCount () 函數返迴目前在做工作的綫程數。

The reserveThread () 函數預定綫程以供外部使用。使用 releaseThread () 當綫程完成時,以便可以重用它。本質上,這些函數臨時遞增 (或縮減) 活動綫程數且很有用當實現的耗時操作不可見對於 QThreadPool .

注意, QThreadPool 是用於管理綫程的低級類,見 Qt Concurrent 模塊,瞭解更高級替代。

另請參閱 QRunnable .

特性文檔編製

activeThreadCount : const int

此特性錶示綫程池中的活動綫程數。

注意: 它是可能的,此函數的返迴值大於 maxThreadCount ()。見 reserveThread () 瞭解更多細節。

訪問函數:

int activeThreadCount () const

另請參閱 reserveThread () 和 releaseThread ().

expiryTimeout : int

綫程未使用 expiryTimeout 毫秒被認為已過期且會退齣。這種綫程將根據需要重新啓動。默認 expiryTimeout 為 30000 毫秒 (30 秒)。若 expiryTimeout 為負值,新近創建的綫程不會過期,如:它們不會退齣,直到綫程池被銷毀。

注意,設置 expiryTimeout 對已運行的綫程沒有作用。僅新近創建的綫程會使用新的 expiryTimeout 。推薦設置 expiryTimeout 立即在創建綫程池後,但先於調用 start ().

訪問函數:

int expiryTimeout () const
void setExpiryTimeout (int expiryTimeout )

maxThreadCount : int

此特性錶示用於綫程池的最大綫程數。

注意: 綫程池始終使用至少 1 綫程,即使 maxThreadCount 限製為 0 (或負值)。

默認 maxThreadCount is QThread::idealThreadCount ().

訪問函數:

int maxThreadCount () const
void setMaxThreadCount (int maxThreadCount )

成員函數文檔編製

QThreadPool:: QThreadPool ( QObject * parent = Q_NULLPTR)

構造綫程池采用給定 parent .

QThreadPool:: ~QThreadPool ()

銷毀 QThreadPool 。此函數會阻塞,直到所有可運行已完成。

void QThreadPool:: clear ()

從隊列移除尚未啓動的可運行。可運行為 runnable->autoDelete() 返迴 true 被刪除。

該函數在 Qt 5.2 引入。

另請參閱 start ().

[static] QThreadPool *QThreadPool:: globalInstance ()

返迴全局 QThreadPool 實例。

void QThreadPool:: releaseThread ()

釋放先前預定的綫程,預定是通過調用 reserveThread ().

注意: 若先前沒有預定綫程,調用此函數會臨時遞增 maxThreadCount ()。這很有用。當綫程進入休眠等待更多工作時,允許其它綫程繼續。確保調用 reserveThread () 當等待完成時,以便綫程池能夠正確維護 activeThreadCount ().

另請參閱 reserveThread ().

void QThreadPool:: reserveThread ()

預定一綫程,不管 activeThreadCount () 和 maxThreadCount ().

一旦綫程完成,調用 releaseThread () 纔允許它被重用。

注意: 此函數將始終遞增活動綫程數。這意味著使用此函數,它是可能的對於 activeThreadCount () 返迴值大於 maxThreadCount ().

另請參閱 releaseThread ().

void QThreadPool:: start ( QRunnable * runnable , int priority = 0)

預定綫程並用它運行 runnable ,除非此綫程將使當前綫程數超過 maxThreadCount ()。在此情況下, runnable 取而代之是被添加到運行隊列。 priority 自變量可以用於控製運行隊列的執行次序。

注意,綫程池擁有所有權對於 runnable if runnable->autoDelete() 返迴 true ,和 runnable 將被綫程池自動刪除後於 runnable->run() 返迴。若 runnable->autoDelete() 返迴 false ,所有權對於 runnable 仍然屬於調用者。注意,改變自動刪除對 runnable 在調用此函數後將導緻未定義行為。

bool QThreadPool:: tryStart ( QRunnable * runnable )

試圖預定綫程以運行 runnable .

若調用時沒有可用綫程,那麼此函數什麼都不做並返迴 false 。否則, runnable 使用某一可用綫程立即運行,且此函數返迴 true .

注意,綫程池擁有所有權對於 runnable if runnable->autoDelete() 返迴 true ,和 runnable 將被綫程池自動刪除後於 runnable->run() 返迴。若 runnable->autoDelete() 返迴 false ,所有權對於 runnable 仍然屬於調用者。注意,改變自動刪除對 runnable 在調用此函數後將導緻未定義行為。

bool QThreadPool:: tryTake ( QRunnable * runnable )

試圖移除指定 runnable 從隊列若它尚未啓動。若可運行未啓動,返迴 true ,且所有權對於 runnable 會被轉移給調用者 (甚至當 runnable->autoDelete() == true )。否則返迴 false .

注意: runnable->autoDelete() == true ,此函數可以移除齣錯的可運行。這稱為 ABA 問題 :原始 runnable 可能已執行且已被刪除。內存被另一可運行重用,那麼將移除,而不是打算移除。齣於此原因,推薦僅對非自動刪除的可運行調用此函數。

該函數在 Qt 5.9 引入。

另請參閱 start () 和 QRunnable::autoDelete ().

bool QThreadPool:: waitForDone ( int msecs = -1)

等待直到 msecs 毫秒以便所有綫程退齣並移除所有綫程從綫程池。返迴 true 若所有綫程被移除;否則它返迴 false 。若 msecs 為 -1 (默認),忽略超時 (等待最後一個綫程退齣)。