點擊藍字 關注咱們web
QThreadPool與QRunnable
線程的建立及銷燬須要與系統交互,會產生很大的開銷。若須要頻繁的建立線程建議使用線程池,有線程池維護必定數量的線程,當須要進行多線程運算時將運算函數傳遞給線程池便可。線程池會根據可用線程進行任務安排。編程
QThreadPool
此類爲Qt提供的線程池函數,使用此類只須要配置線程池的最大線程數量、線程長時間不使用的過時時間等參數,不須要進行QThread相關的操做。微信
此類有兩種使用方式:全局線程池和局部線程池。多線程
Public Function
int activeThreadCount() const //當前的活動線程數量
void clear()//清除全部當前排隊但未開始運行的任務
int expiryTimeout() const//線程長時間未使用將會自動退出節約資源,此函數返回等待時間
int maxThreadCount() const//線程池可維護的最大線程數量
void releaseThread()//釋放被保留的線程
void reserveThread()//保留線程,此線程將不會佔用最大線程數量,從而可能會引發當前活動線程數量大於最大線程數量的狀況
void setExpiryTimeout(int expiryTimeout)//設置線程回收的等待時間
void setMaxThreadCount(int maxThreadCount)//設置最大線程數量
void setStackSize(uint stackSize)//此屬性包含線程池工做線程的堆棧大小。
uint stackSize() const//堆大小
void start(QRunnable *runnable, int priority = 0)//加入一個運算到隊列,注意start不必定馬上啓動,只是插入到隊列,排到了纔會開始運行。須要傳入QRunnable ,後續介紹
bool tryStart(QRunnable *runnable)//嘗試啓動一個
bool tryTake(QRunnable *runnable)//刪除隊列中的一個QRunnable,若當前QRunnable 未啓動則返回成功,正在運行則返回失敗
bool waitForDone(int?<i>msecs</i>?=?-1)//等待全部線程運行結束並退出,參數爲等待時間-1表示一直等待到最後一個線程退出
全局線程池
QThreadPool提供了一個靜態函數,globalInstance(),使用此方法可獲取一個當前進程的全局線程池,可在多個類中共同使用一個線程池。app
局部線程池
和常規類的使用相同,能夠經過QThreadPool pool;
的方式創建一個局部線程池,並由當前類維護,可保證此線程池僅供當前類應用編輯器
QRunnable類
QRunnable類在Qt中是全部可運行對象的基類,表明了由run()函數表示的一個任務或一段要執行的代碼。咱們通常使用該類和QThreadPool來在另外一個獨立的線程中執行該代碼。而且,若是QRunnable對象的autoDelete()
設爲true
的話,QThreadPool
會在run()運行結束後自動刪除該對象。函數
QRunnable有run、autodelete、setautodelete這三個關鍵函數。學習
重寫run函數flex
protected:
void run();
QRunable與線程池例子
程序演示:ui
建立線程池,定義線程數量爲15,在裏面取出兩個線程去進行業務邏輯處理,這裏的邏輯處理就是打印0~10
建立一個MyRUnable類
,繼承QObject
和QRunnable
myrunable.h:
#ifndef MYRUNABLE_H
#define MYRUNABLE_H
#include <QObject>
#include <QRunnable>
#include <QDebug>
#include <QThread>
class MyRunable : public QObject, public QRunnable
{
Q_OBJECT
public:
explicit MyRunable(QObject *parent = nullptr);
~MyRunable();
protected:
void run();
};
#endif // MYRUNABLE_H
myrunable.c
#include "myrunable.h"
MyRunable::MyRunable(QObject *parent) : QObject(parent)
{
}
MyRunable::~MyRunable()
{
qDebug()<<"delete Task";
}
void MyRunable::run()
{
int i = 10;
while(i--)
{
qDebug() << "線程id:"<< QThread::currentThreadId()<< QString(":剩餘%1").arg(i);
QThread::sleep(1);
}
}
main.c
#include <QCoreApplication>
#include <QDebug>
#include <QThread>
#include <QThreadPool>
#include"myrunable.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug() << "main thread id: " << QThread::currentThreadId();
QThreadPool::globalInstance()->setMaxThreadCount(15); //設置線程池最大線程數量
MyRunable* task = new MyRunable();
task->setAutoDelete(true); //autoDelete屬性默認爲true QThreadPool會在run()函數運行結束後,自動刪除了MyTask對象
QThreadPool::globalInstance()->start(task); //任務放進線程池
QThread::sleep(1);
MyRunable* task1 = new MyRunable();
task1->setAutoDelete(true);
QThreadPool::globalInstance()->start(task1);
QThreadPool::globalInstance()->waitForDone(); //等待任務結束
qDebug() << "end";
return a.exec();
}
關鍵字【線程池】
End
本文分享自微信公衆號 - 編程學習基地(LearnBase)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。