最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

QT線程池的使用(QThreadPool類和QRunnable類)

 更新時(shí)間:2023年04月25日 10:43:34   作者:lesliefish  
本文主要介紹了QT線程池的使用(QThreadPool類和QRunnable類),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

QThreadPool類

用來(lái)管理 QThreads。此類中的所有函數(shù)都是線程安全的.

主要屬性

1、activeThreadCount: 此屬性表示線程池中的活動(dòng)線程數(shù),通過(guò)activeThreadCount() 調(diào)用。
2、expiryTimeout: 線程活著的時(shí)間。沒(méi)有設(shè)置expiryTimeout毫秒的線程會(huì)自動(dòng)退出,此類線程將根據(jù)需要重新啟動(dòng)。默認(rèn)的expiryTimeout為30000毫秒 (30 秒)。如果expiryTimeout為負(fù), 則新創(chuàng)建的線程將不會(huì)過(guò)期, 在線程池被銷毀之前, 它們將不會(huì)退出。通過(guò)expiryTimeout()調(diào)用,通setExpiryTimeout(int expiryTimeout)設(shè)置 。
3、maxThreadCount : int 表示線程池使用的最大線程數(shù)。
通過(guò)maxThreadCount() 調(diào)用,通過(guò)setMaxThreadCount(int maxThreadCount) 設(shè)置
注意:即使maxThreadCount限制為零或?yàn)樨?fù)數(shù), 線程池也至少有1個(gè)線程。

主要成員函數(shù)

QThreadPool *QThreadPool::globalInstance()

返回Qt應(yīng)用程序全局線程池實(shí)例。

void reserveThread()

預(yù)約一個(gè)線程,這個(gè)函數(shù)總是會(huì)增加活動(dòng)線程的數(shù)量。這意味著通過(guò)使用這個(gè)函數(shù),activeThreadCount()可以返回一個(gè)大于maxThreadCount()的值。

void releaseThread()

釋放以前通過(guò)調(diào)用reserveThread()預(yù)約的線程。
如果不先預(yù)約一個(gè)線程,調(diào)用這個(gè)函數(shù)會(huì)臨時(shí)增加maxThreadCount()。當(dāng)線程進(jìn)入休眠等待時(shí),能夠允許其他線程繼續(xù)。
要記得在完成等待時(shí)調(diào)用reserveThread(),以便線程池可以正確控制activeThreadCount()。

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

在任務(wù)數(shù)量小于maxThreadCount時(shí),為每個(gè)runnable任務(wù)預(yù)約一個(gè)線程。超過(guò)maxThreadCount時(shí),將任務(wù)放入運(yùn)行隊(duì)列中。priority 參數(shù)用來(lái)設(shè)置線程運(yùn)行優(yōu)先級(jí)。

bool tryStart(QRunnable *runnable)

此方法嘗試預(yù)約一個(gè)線程來(lái)運(yùn)行runnable。
如果在調(diào)用的時(shí)候沒(méi)有線程可用,那么這個(gè)函數(shù)什么都不做,并返回false。否則,將使用一個(gè)可用線程立即運(yùn)行runnable,并返回此函數(shù)true。

void clear()

用于刪除在任務(wù)隊(duì)列中,還沒(méi)有啟動(dòng)的任務(wù)。

bool tryTake(QRunnable *runnable)

如果runnable任務(wù)還沒(mé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毫秒, 以便所有線程退出并從線程池中移除所有線程。如果刪除了所有線程, 則返回true ,否則, 它將返回false。默認(rèn)等待時(shí)間為-1,即等待最后一個(gè)線程退出。

QRunnable類

QRunnable類是所有runable對(duì)象的基類。
QRunnable類是一個(gè)接口, 用于表示需要執(zhí)行的任務(wù)或代碼段, 具體任務(wù)在run() 函數(shù)內(nèi)部實(shí)現(xiàn)。
可以使用QThreadPool在各個(gè)獨(dú)立的線程中執(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子類中實(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)不屬于線程池,由開發(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ù)類(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:
? ? //注意!要使用信號(hào),采用QObejct 和 QRunnable多繼承,記得QObject要放在前面
? ? void mySignal();
};

#endif // PRINTTASK_H

任務(wù)類(runable類)實(shí)現(xiàn)文件

#include "printtask.h"
#include <QThread>
#include <iostream>
using std::cout;
using std::endl;

PrintTask::PrintTask()
{
}

PrintTask::~PrintTask()
{

}

//線程真正執(zhí)行的內(nèi)容
void PrintTask::run()
{
? ? cout << "PrintTask run 被調(diào)用,調(diào)用線程ID為:" << QThread::currentThread() << endl;
}

主函數(shù)文件:

#include <QCoreApplication>
#include <QThreadPool>
#include "printtask.h"

int main(int argc, char *argv[])
{
? ? QCoreApplication a(argc, argv);

? ? //設(shè)置最大線程數(shù)為3的一個(gè)線程池
? ? 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)用線程ID為:00533678
PrintTask run 被調(diào)用,調(diào)用線程ID為:00533678
PrintTask run 被調(diào)用,調(diào)用線程ID為:004F3868
PrintTask run 被調(diào)用,調(diào)用線程ID為:004F3848
PrintTask run 被調(diào)用,調(diào)用線程ID為:00533678
PrintTask run 被調(diào)用,調(diào)用線程ID為:00533678
PrintTask run 被調(diào)用,調(diào)用線程ID為:004F3848
PrintTask run 被調(diào)用,調(diào)用線程ID為:004F3868
PrintTask run 被調(diào)用,調(diào)用線程ID為:00533678
PrintTask run 被調(diào)用,調(diào)用線程ID為:00533678
PrintTask run 被調(diào)用,調(diào)用線程ID為:004F3848
PrintTask run 被調(diào)用,調(diào)用線程ID為:00533678
PrintTask run 被調(diào)用,調(diào)用線程ID為:004F3868
PrintTask run 被調(diào)用,調(diào)用線程ID為:004F3848
PrintTask run 被調(diào)用,調(diào)用線程ID為:00533678
PrintTask run 被調(diào)用,調(diào)用線程ID為:004F3868
PrintTask run 被調(diào)用,調(diào)用線程ID為:004F3848
PrintTask run 被調(diào)用,調(diào)用線程ID為:004F3868
...

分析打印結(jié)果發(fā)現(xiàn):20個(gè)任務(wù),只有3個(gè)線程(線程ID分別為00533678、004F3848,004F3868)去執(zhí)行,符合期望。

到此這篇關(guān)于QT線程池的使用(QThreadPool類和QRunnable類)的文章就介紹到這了,更多相關(guān)QT線程池內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

垫江县| 厦门市| 屏边| 同仁县| 本溪市| 安龙县| 托里县| 汾西县| 郎溪县| 龙川县| 保定市| 土默特左旗| 普定县| 夏河县| 弥渡县| 德昌县| 玉林市| 青海省| 莫力| 玛纳斯县| 屏边| 云和县| 梨树县| 盘锦市| 桃江县| 布尔津县| 澜沧| 大邑县| 扎兰屯市| 扎鲁特旗| 南宫市| 巴东县| 舒兰市| 筠连县| 马鞍山市| 游戏| 图木舒克市| 望奎县| 万源市| 塔河县| 吴旗县|