您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“QT線程池如何使用”,內容詳細,步驟清晰,細節處理妥當,希望這篇“QT線程池如何使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
用來管理 QThreads。此類中的所有函數都是線程安全的.
1、activeThreadCount: 此屬性表示線程池中的活動線程數,通過activeThreadCount() 調用。
2、expiryTimeout: 線程活著的時間。沒有設置expiryTimeout毫秒的線程會自動退出,此類線程將根據需要重新啟動。默認的expiryTimeout為30000毫秒 (30 秒)。如果expiryTimeout為負, 則新創建的線程將不會過期, 在線程池被銷毀之前, 它們將不會退出。通過expiryTimeout()調用,通setExpiryTimeout(int expiryTimeout)設置 。
3、maxThreadCount : int 表示線程池使用的最大線程數。
通過maxThreadCount() 調用,通過setMaxThreadCount(int maxThreadCount) 設置
注意:即使maxThreadCount限制為零或為負數, 線程池也至少有1個線程。
QThreadPool *QThreadPool::globalInstance()
返回Qt應用程序全局線程池實例。
void reserveThread()
預約一個線程,這個函數總是會增加活動線程的數量。這意味著通過使用這個函數,activeThreadCount()可以返回一個大于maxThreadCount()的值。
void releaseThread()
釋放以前通過調用reserveThread()預約的線程。
如果不先預約一個線程,調用這個函數會臨時增加maxThreadCount()。當線程進入休眠等待時,能夠允許其他線程繼續。
要記得在完成等待時調用reserveThread(),以便線程池可以正確控制activeThreadCount()。
void QThreadPool :: start(QRunnable * runnable,int priority = 0)
在任務數量小于maxThreadCount時,為每個runnable任務預約一個線程。超過maxThreadCount時,將任務放入運行隊列中。priority 參數用來設置線程運行優先級。
bool tryStart(QRunnable *runnable)
此方法嘗試預約一個線程來運行runnable。
如果在調用的時候沒有線程可用,那么這個函數什么都不做,并返回false。否則,將使用一個可用線程立即運行runnable,并返回此函數true。
void clear()
用于刪除在任務隊列中,還沒有啟動的任務。
bool tryTake(QRunnable *runnable)
如果runnable任務還沒開始運行,那么從隊列中刪除此runable任務,此時函數返回true;如果runnable任務已經運行,返回false。
只用來刪除runnable->autoDelete() == false的runnable任務,否則可能會刪錯任務.
bool waitForDone(int msecs = -1)
等待msecs毫秒, 以便所有線程退出并從線程池中移除所有線程。如果刪除了所有線程, 則返回true ,否則, 它將返回false。默認等待時間為-1,即等待最后一個線程退出。
QRunnable類是所有runable對象的基類。
QRunnable類是一個接口, 用于表示需要執行的任務或代碼段, 具體任務在run() 函數內部實現。
可以使用QThreadPool在各個獨立的線程中執行代碼。如果autoDelete() 返回true (默認值), QThreadPool將自動刪除QRunnable 。使用setAutoDelete() 可更改是否自動刪除。
bool autoDelete() const
獲取自動刪除是否啟用,啟用返回true,未啟用返回false。
virtual void run() = 0
純虛函數,在QRunnable子類中實現詳細任務處理邏輯。
void setAutoDelete(bool autoDelete)
如果autoDelete為 true, 則啟用自動刪除。否則自動刪除將被禁用。
如果啟用了自動刪除, QThreadPool將在調用 run () 函數返回后自動刪除此runable對象。否則, runable對象所有權不屬于線程池,由開發人員管理。
請注意, 必須先設置此標志,(默認構造函數已經將其設置為true),然后才能調用QThreadPool:: start()。在QThreadPool:: start() 之后調用此函數將導致不可預測后果。
任務類(runable類)頭文件
#ifndef PRINTTASK_H #define PRINTTASK_H #include <QObject> #include <QRunnable> class PrintTask : public QObject, public QRunnable { Q_OBJECT public: PrintTask(); ~PrintTask(); protected: void run(); signals: //注意!要使用信號,采用QObejct 和 QRunnable多繼承,記得QObject要放在前面 void mySignal(); }; #endif // PRINTTASK_H
任務類(runable類)實現文件
#include "printtask.h" #include <QThread> #include <iostream> using std::cout; using std::endl; PrintTask::PrintTask() { } PrintTask::~PrintTask() { } //線程真正執行的內容 void PrintTask::run() { cout << "PrintTask run 被調用,調用線程ID為:" << QThread::currentThread() << endl; }
主函數文件:
#include <QCoreApplication> #include <QThreadPool> #include "printtask.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); //設置最大線程數為3的一個線程池 QThreadPool pool; pool.setMaxThreadCount(3); for(int i = 0; i < 20; i++) { pool.start(new PrintTask()); } return a.exec(); }
輸出:
PrintTask run 被調用,調用線程ID為:00533678
PrintTask run 被調用,調用線程ID為:00533678
PrintTask run 被調用,調用線程ID為:004F3868
PrintTask run 被調用,調用線程ID為:004F3848
PrintTask run 被調用,調用線程ID為:00533678
PrintTask run 被調用,調用線程ID為:00533678
PrintTask run 被調用,調用線程ID為:004F3848
PrintTask run 被調用,調用線程ID為:004F3868
PrintTask run 被調用,調用線程ID為:00533678
PrintTask run 被調用,調用線程ID為:00533678
PrintTask run 被調用,調用線程ID為:004F3848
PrintTask run 被調用,調用線程ID為:00533678
PrintTask run 被調用,調用線程ID為:004F3868
PrintTask run 被調用,調用線程ID為:004F3848
PrintTask run 被調用,調用線程ID為:00533678
PrintTask run 被調用,調用線程ID為:004F3868
PrintTask run 被調用,調用線程ID為:004F3848
PrintTask run 被調用,調用線程ID為:004F3868
...
分析打印結果發現:20個任務,只有3個線程(線程ID分別為00533678、004F3848,004F3868)去執行,符合期望。
讀到這里,這篇“QT線程池如何使用”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。