Qt文档阅读笔记-QThreadPool官方解析及实例
QThreadPool管理及回收QThread對象,用來減少線程創(chuàng)建時帶來的系統(tǒng)開銷。每一個Qt進程都有個全局的QThreadPool對象,可以通過globalInstance()獲取其對象。
要想使用QThreadPool中的線程,需要先創(chuàng)建一個類,這個類繼承QRunnable,并且要重寫其run()方法。隨后創(chuàng)建其對象,調用QThreadPool::start()方法,如下實例代碼:
class HelloWorldTask : public QRunnable{void run() override{qDebug() << "Hello world from thread" << QThread::currentThread();}};HelloWorldTask *hello = new HelloWorldTask();// QThreadPool takes ownership and deletes 'hello' automaticallyQThreadPool::globalInstance()->start(hello);QThreadPool會自動釋放QRunnable的子類,使用QRunnable::setAutoDelete()改變auto-deletion標識。
QThreadPool支持多次執(zhí)行相同的QRunnable線程。這里推薦使用tryStart(this)。當最后一個線程執(zhí)行結束,QRunnable就會被自動釋放掉。
啟用autoDelete后,調用start()多次啟動相同的進程時,會形成競爭條件,不建議這么使用。
在一定時間內未被使用的線程會過期,默認是30s,可以通過setExpiryTimeout()來設置。
setMaxThreadCount()設置最大線程數(shù)maxThreadCount()用于查詢.
maxThreadCount()的默認值為QThread::idealThreadCount(),activeThreadCount()返回當前正在工作的線程數(shù)。
reserveThread()函數(shù)是在線程外使用的。當調用releaseThread()來釋放線程時,這個線程可能會被重復利用,這時reserveThread()就可以得到releaThread()的那個線程。
?
下面是自己寫的一個小栗子
功能是這樣的:
寫一個線程,這個線程放到QThreadPool,里面,并且線程池每秒調用一次,QThreadPool里面的線程,把當前時間發(fā)送給主線程。然后打印。
還是有點意思的!
程序運行截圖如下:
源碼如下:
Com.h
#ifndef COM_H #define COM_H#include <QObject>QT_BEGIN_NAMESPACE class QThreadPool; class QTimer; QT_END_NAMESPACEclass Com : public QObject {Q_OBJECT public:Com(QObject *parent = nullptr);protected slots:void timeOut();void getTime(const QString &time);private:QThreadPool *m_pool;QTimer *m_timer; };#endif // COM_HWoork.h
#ifndef WORK_H #define WORK_H#include <QObject> #include <QRunnable>class Work : public QObject, public QRunnable {Q_OBJECT public:Work();~Work();protected:void run() Q_DECL_OVERRIDE;signals:void nowTime(const QString &time); };#endif // WORK_HCom.cpp
#include "Com.h" #include "Woork.h" #include <QTimer> #include <QThreadPool> #include <QDebug>Com::Com(QObject *parent) : QObject(parent) {m_timer = new QTimer(this);m_pool = new QThreadPool(this);m_pool->setMaxThreadCount(1);connect(m_timer, &QTimer::timeout, this, &Com::timeOut);m_timer->start(1000); }void Com::timeOut() {Work *work = new Work;connect(work, &Work::nowTime, this, &Com::getTime);m_pool->start(work); }void Com::getTime(const QString &time) {qDebug() << "接收到:" + time; }main.cpp
#include <QCoreApplication> #include "Com.h"int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);Com com;return a.exec(); }Woork.cpp
#include "Woork.h" #include <QDateTime> #include <QDebug>Work::Work() {qDebug() << "Work::Work()"; }Work::~Work() {qDebug() << "Work::~Work()"; }void Work::run() {emit this->nowTime(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")); }源碼打包下載地址:
https://github.com/fengfanchen/Qt/tree/master/QThreadPoolDemo
總結
以上是生活随笔為你收集整理的Qt文档阅读笔记-QThreadPool官方解析及实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt文档阅读笔记-QtConcurren
- 下一篇: C++笔记-QSslSocket::su