QT線(xiàn)程池的使用(QThreadPool類(lèi)和QRunnable類(lèi))
QThreadPool類(lèi)
用來(lái)管理 QThreads。此類(lèi)中的所有函數(shù)都是線(xiàn)程安全的.
主要屬性
1、activeThreadCount: 此屬性表示線(xiàn)程池中的活動(dòng)線(xiàn)程數(shù),通過(guò)activeThreadCount() 調(diào)用。
2、expiryTimeout: 線(xiàn)程活著的時(shí)間。沒(méi)有設(shè)置expiryTimeout毫秒的線(xiàn)程會(huì)自動(dòng)退出,此類(lèi)線(xiàn)程將根據(jù)需要重新啟動(dòng)。默認(rèn)的expiryTimeout為30000毫秒 (30 秒)。如果expiryTimeout為負(fù), 則新創(chuàng)建的線(xiàn)程將不會(huì)過(guò)期, 在線(xiàn)程池被銷(xiāo)毀之前, 它們將不會(huì)退出。通過(guò)expiryTimeout()調(diào)用,通setExpiryTimeout(int expiryTimeout)設(shè)置 。
3、maxThreadCount : int 表示線(xiàn)程池使用的最大線(xiàn)程數(shù)。
通過(guò)maxThreadCount() 調(diào)用,通過(guò)setMaxThreadCount(int maxThreadCount) 設(shè)置
注意:即使maxThreadCount限制為零或?yàn)樨?fù)數(shù), 線(xiàn)程池也至少有1個(gè)線(xiàn)程。
主要成員函數(shù)
QThreadPool *QThreadPool::globalInstance()
返回Qt應(yīng)用程序全局線(xiàn)程池實(shí)例。
void reserveThread()
預(yù)約一個(gè)線(xiàn)程,這個(gè)函數(shù)總是會(huì)增加活動(dòng)線(xiàn)程的數(shù)量。這意味著通過(guò)使用這個(gè)函數(shù),activeThreadCount()可以返回一個(gè)大于maxThreadCount()的值。
void releaseThread()
釋放以前通過(guò)調(diào)用reserveThread()預(yù)約的線(xiàn)程。
如果不先預(yù)約一個(gè)線(xiàn)程,調(diào)用這個(gè)函數(shù)會(huì)臨時(shí)增加maxThreadCount()。當(dāng)線(xiàn)程進(jìn)入休眠等待時(shí),能夠允許其他線(xiàn)程繼續(xù)。
要記得在完成等待時(shí)調(diào)用reserveThread(),以便線(xiàn)程池可以正確控制activeThreadCount()。
void QThreadPool :: start(QRunnable * runnable,int priority = 0)
在任務(wù)數(shù)量小于maxThreadCount時(shí),為每個(gè)runnable任務(wù)預(yù)約一個(gè)線(xiàn)程。超過(guò)maxThreadCount時(shí),將任務(wù)放入運(yùn)行隊(duì)列中。priority 參數(shù)用來(lái)設(shè)置線(xiàn)程運(yùn)行優(yōu)先級(jí)。
bool tryStart(QRunnable *runnable)
此方法嘗試預(yù)約一個(gè)線(xiàn)程來(lái)運(yùn)行runnable。
如果在調(diào)用的時(shí)候沒(méi)有線(xiàn)程可用,那么這個(gè)函數(shù)什么都不做,并返回false。否則,將使用一個(gè)可用線(xiàn)程立即運(yùn)行runnable,并返回此函數(shù)true。
void clear()
用于刪除在任務(wù)隊(duì)列中,還沒(méi)有啟動(dòng)的任務(wù)。
bool tryTake(QRunnable *runnable)
如果runnable任務(wù)還沒(méi)開(kāi)始運(yùn)行,那么從隊(duì)列中刪除此runable任務(wù),此時(shí)函數(shù)返回true;如果runnable任務(wù)已經(jīng)運(yùn)行,返回false。
只用來(lái)刪除runnable->autoDelete() == false的runnable任務(wù),否則可能會(huì)刪錯(cuò)任務(wù).
bool waitForDone(int msecs = -1)
等待msecs毫秒, 以便所有線(xiàn)程退出并從線(xiàn)程池中移除所有線(xiàn)程。如果刪除了所有線(xiàn)程, 則返回true ,否則, 它將返回false。默認(rèn)等待時(shí)間為-1,即等待最后一個(gè)線(xiàn)程退出。
QRunnable類(lèi)
QRunnable類(lèi)是所有runable對(duì)象的基類(lèi)。
QRunnable類(lèi)是一個(gè)接口, 用于表示需要執(zhí)行的任務(wù)或代碼段, 具體任務(wù)在run() 函數(shù)內(nèi)部實(shí)現(xiàn)。
可以使用QThreadPool在各個(gè)獨(dú)立的線(xiàn)程中執(zhí)行代碼。如果autoDelete() 返回true (默認(rèn)值), QThreadPool將自動(dòng)刪除QRunnable 。使用setAutoDelete() 可更改是否自動(dòng)刪除。
主要成員函數(shù)
bool autoDelete() const
獲取自動(dòng)刪除是否啟用,啟用返回true,未啟用返回false。
virtual void run() = 0
純虛函數(shù),在QRunnable子類(lèi)中實(shí)現(xiàn)詳細(xì)任務(wù)處理邏輯。
void setAutoDelete(bool autoDelete)
如果autoDelete為 true, 則啟用自動(dòng)刪除。否則自動(dòng)刪除將被禁用。
如果啟用了自動(dòng)刪除, QThreadPool將在調(diào)用 run () 函數(shù)返回后自動(dòng)刪除此runable對(duì)象。否則, runable對(duì)象所有權(quán)不屬于線(xiàn)程池,由開(kāi)發(fā)人員管理。
請(qǐng)注意, 必須先設(shè)置此標(biāo)志,(默認(rèn)構(gòu)造函數(shù)已經(jīng)將其設(shè)置為true),然后才能調(diào)用QThreadPool:: start()。在QThreadPool:: start() 之后調(diào)用此函數(shù)將導(dǎo)致不可預(yù)測(cè)后果。
程序?qū)嵗?/h2>
任務(wù)類(lèi)(runable類(lèi))頭文件
#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: ? ? //注意!要使用信號(hào),采用QObejct 和 QRunnable多繼承,記得QObject要放在前面 ? ? void mySignal(); }; #endif // PRINTTASK_H
任務(wù)類(lèi)(runable類(lèi))實(shí)現(xiàn)文件
#include "printtask.h" #include <QThread> #include <iostream> using std::cout; using std::endl; PrintTask::PrintTask() { } PrintTask::~PrintTask() { } //線(xiàn)程真正執(zhí)行的內(nèi)容 void PrintTask::run() { ? ? cout << "PrintTask run 被調(diào)用,調(diào)用線(xiàn)程ID為:" << QThread::currentThread() << endl; }
主函數(shù)文件:
#include <QCoreApplication> #include <QThreadPool> #include "printtask.h" int main(int argc, char *argv[]) { ? ? QCoreApplication a(argc, argv); ? ? //設(shè)置最大線(xiàn)程數(shù)為3的一個(gè)線(xiàn)程池 ? ? QThreadPool pool; ? ? pool.setMaxThreadCount(3); ? ? for(int i = 0; i < 20; i++) ? ? { ? ? ? ? pool.start(new PrintTask()); ? ? } ? ? return a.exec(); }
輸出:
PrintTask run 被調(diào)用,調(diào)用線(xiàn)程ID為:00533678
PrintTask run 被調(diào)用,調(diào)用線(xiàn)程ID為:00533678
PrintTask run 被調(diào)用,調(diào)用線(xiàn)程ID為:004F3868
PrintTask run 被調(diào)用,調(diào)用線(xiàn)程ID為:004F3848
PrintTask run 被調(diào)用,調(diào)用線(xiàn)程ID為:00533678
PrintTask run 被調(diào)用,調(diào)用線(xiàn)程ID為:00533678
PrintTask run 被調(diào)用,調(diào)用線(xiàn)程ID為:004F3848
PrintTask run 被調(diào)用,調(diào)用線(xiàn)程ID為:004F3868
PrintTask run 被調(diào)用,調(diào)用線(xiàn)程ID為:00533678
PrintTask run 被調(diào)用,調(diào)用線(xiàn)程ID為:00533678
PrintTask run 被調(diào)用,調(diào)用線(xiàn)程ID為:004F3848
PrintTask run 被調(diào)用,調(diào)用線(xiàn)程ID為:00533678
PrintTask run 被調(diào)用,調(diào)用線(xiàn)程ID為:004F3868
PrintTask run 被調(diào)用,調(diào)用線(xiàn)程ID為:004F3848
PrintTask run 被調(diào)用,調(diào)用線(xiàn)程ID為:00533678
PrintTask run 被調(diào)用,調(diào)用線(xiàn)程ID為:004F3868
PrintTask run 被調(diào)用,調(diào)用線(xiàn)程ID為:004F3848
PrintTask run 被調(diào)用,調(diào)用線(xiàn)程ID為:004F3868
...
分析打印結(jié)果發(fā)現(xiàn):20個(gè)任務(wù),只有3個(gè)線(xiàn)程(線(xiàn)程ID分別為00533678、004F3848,004F3868)去執(zhí)行,符合期望。
到此這篇關(guān)于QT線(xiàn)程池的使用(QThreadPool類(lèi)和QRunnable類(lèi))的文章就介紹到這了,更多相關(guān)QT線(xiàn)程池內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言詳解如何實(shí)現(xiàn)帶頭雙向循環(huán)鏈表
帶頭雙向循環(huán)鏈表:結(jié)構(gòu)最復(fù)雜,一般用在單獨(dú)存儲(chǔ)數(shù)據(jù)。實(shí)際中使用的鏈表數(shù)據(jù)結(jié)構(gòu),都是帶頭雙向循環(huán)鏈表。另外這個(gè)結(jié)構(gòu)雖然結(jié)構(gòu)復(fù)雜,但是使用代碼實(shí)現(xiàn)以后會(huì)發(fā)現(xiàn)結(jié)構(gòu)會(huì)帶來(lái)很多優(yōu)勢(shì),實(shí)現(xiàn)反而簡(jiǎn)單2022-04-04C語(yǔ)言超全面define預(yù)處理指令的使用說(shuō)明
C語(yǔ)言里可以用#define定義一個(gè)標(biāo)識(shí)符來(lái)表示一個(gè)常量。特點(diǎn)是:定義的標(biāo)識(shí)符不占內(nèi)存,只是一個(gè)臨時(shí)的符號(hào),預(yù)編譯后這個(gè)符號(hào)就不存在了,也不做類(lèi)型定義。預(yù)編譯又叫預(yù)處理2022-04-04C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)圖的創(chuàng)建與遍歷實(shí)驗(yàn)示例
這篇文章主要為大家介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)圖的創(chuàng)建與遍歷實(shí)驗(yàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06新舊MFC版本實(shí)現(xiàn)CEdit透明的2種方法的實(shí)例代碼
新舊MFC版本實(shí)現(xiàn)CEdit透明的2種方法的實(shí)例代碼,需要的朋友可以參考一下2013-03-03詳解C++何時(shí)需要拷貝構(gòu)造函數(shù)
拷貝構(gòu)造函數(shù)是一個(gè)特殊的構(gòu)造函數(shù),用于創(chuàng)建一個(gè)新對(duì)象,該對(duì)象與另一個(gè)同類(lèi)對(duì)象具有相同的屬性和值,在 C++ 中,拷貝構(gòu)造函數(shù)通常采用另一個(gè)同類(lèi)對(duì)象作為參數(shù),并使用該對(duì)象初始化新對(duì)象,本文給大家講講何時(shí)需要拷貝函數(shù),需要的朋友可以參考下2023-09-09