QThreadPool管理及回收QThread对象,用来减少线程创建时带来的系统开销。每一个Qt进程都有个全局的QThreadPool对象,可以通过globalInstance()获取其对象。

要想使用QThreadPool中的线程,需要先创建一个类,这个类继承QRunnable,并且要重写其run()方法。随后创建其对象,调用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支持多次执行相同的QRunnable线程。这里推荐使用tryStart(this)。当最后一个线程执行结束,QRunnable就会被自动释放掉。

启用autoDelete后,调用start()多次启动相同的进程时,会形成竞争条件,不建议这么使用。

在一定时间内未被使用的线程会过期,默认是30s,可以通过setExpiryTimeout()来设置。

setMaxThreadCount()设置最大线程数maxThreadCount()用于查询.

maxThreadCount()的默认值为QThread::idealThreadCount(),activeThreadCount()返回当前正在工作的线程数。

reserveThread()函数是在线程外使用的。当调用releaseThread()来释放线程时,这个线程可能会被重复利用,这时reserveThread()就可以得到releaThread()的那个线程。

下面是自己写的一个小栗子

功能是这样的:

写一个线程,这个线程放到QThreadPool,里面,并且线程池每秒调用一次,QThreadPool里面的线程,把当前时间发送给主线程。然后打印。

还是有点意思的!

程序运行截图如下:

源码如下:

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_H

Woork.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_H

Com.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官方解析及实例相关推荐

  1. Qt文档阅读笔记-QSet官方解析及实例

    目录 官方解析 博主栗子 官方解析 QSet类是一个模板类,他是一个哈希表集合. QSet<T>是Qt的一个普通容器类.QSet存储的值是不指明顺序的,QSet对这些值提供了快速检索的功能 ...

  2. Qt文档阅读笔记-QtWebApp官方解析与实例(使用QtWebApp搭建HTTP服务器)

    目录 官方解析 博主例子 官方解析 QtWepApp是一个C++的http服务器,受到了java Servlets的启发,因为是Qt写的,所以有跨平台的支持. QtWebApp包含如下的组成部分:   ...

  3. Qt文档阅读笔记-QHostInfo官方解析与实例(根据Host获取IP)

    官方解析 QHostInfo提供了一个静态方法获取主机名: QHostInfo中有一个查找机制,可以根据IP找主机名,也可能工具主机名找IP,可以通过调用QHostInfo::lookupHost这个 ...

  4. Qt文档阅读笔记-QTcpServer官方解析与实例(使用QSocket创建简单的HTTP服务器)

    目录 官方解析 博主例子(做一个简单的HTTP服务器) 本例子中HTTP协议关键点 官方解析 QTcpServer类,提供TCP服务的基础: 这个类接受TCP连接,可以指定一个端口,也可以让其自动一个 ...

  5. Qt文档阅读笔记-QWebPage官方解析与实例

    目录 官方解析 博主例子 源码下载地址 官方解析 QWebPage提供一个视图对象和一个web页面: QWebPage提供了web页面的内容,各种设置(是否支持JavaScript等)和连接,它与QW ...

  6. Qt文档阅读笔记-QWebView官方解析与实例

    目录 背景 官方解析 博主例子 背景 最近发现某Qt项目,出现的效果杠杆的,在看某一小功能的时候,发现有个echart的东西,百度了发现,真的是一个新大陆,Qt加web编程,贼吉尔可怕. 在此发现使用 ...

  7. Qt文档阅读笔记-Q_CLASSINFO官方解析与实例

    官方解析 Q_CLASSINFO 这个宏为类提供额外的信息,要想获取这个Q_CLASSINFO这个信息要使用QObject::metaObject().Qt在Active Qt,Qt D-BUS以及Q ...

  8. Qt文档阅读笔记-stackUnder官方解析与实例

    目录 官方解析 博主例子 官方解析 这里可以配合raise()和lower()这两个函数来使用! 博主例子 用2个label,点击谁谁就浮在界面的最上面,很简单的代码,程序运行截图如下: 源码如下: ...

  9. Qt文档阅读笔记-QPropertyAnimation官方解析及实例

    目录 官方解析 博主例子 官方解析 QPropertyAnimation QPropertyAnimation类为Qt属性提供动画. QPropertyAnimation类可以修改Qt属性,从而达到动 ...

最新文章

  1. jQuery进行简单验证的正则表达式
  2. Awesome Projects (汇聚全球所有
  3. 安卓开发笔记——自定义广告轮播Banner(实现无限循环)
  4. 克隆树莓Raspberry Pi Mode4 的TF卡
  5. Bind和Eval的区别详解
  6. 【数据结构与算法】之深入解析“将数据流变为多个不相交区间”的求解思路与算法示例
  7. 跳一跳201803-1
  8. 使用 nohup 设置后台进程
  9. python 双向循环链表实现_python实现双向循环链表基本结构及其基本方法
  10. stm32的rxne和idle中断_STM32 HAL CubeMX 串口IDLE接收空闲中断+DMA
  11. 【汇编优化】之内联汇编
  12. chapter1.4.4
  13. linux 当前用户 命令 w who(转)
  14. Windows2008R2自动更新造成的意外重启
  15. 如何手动编辑art分区修改qsdk(qca9531、qca9563)无线mac地址
  16. 以淘宝为例,解析大型电商服务端架构!
  17. 微信服务号运营的八大策略
  18. 不懂PS也制作图片倒影效果 – 推荐2个好用的在线为图片添加倒影效果的网站
  19. Java项目:图书管理系统(java+JSP+layui+bootstrap+Servlet+Mysql)
  20. win10查看端口号、进程

热门文章

  1. Cognitive Security的异常检测技术
  2. 以前的报表都白做了!app上做可视化数据分析,这个方法太强了
  3. 飞鸽传书 扩散全身的
  4. 神清气爽,小妹妹,先给她示范了一遍红色警戒
  5. 用一个中介对象来封装一系列的对象交互
  6. 今天的虎兄才跳了过去的飞秋WZ132
  7. 昨天飞鸽传书可能是因为太累了
  8. 基于Nokia S60的游戏开发之二
  9. 世界上最好用的浏览器Chrome 10周岁生日,迎来一大波更新!
  10. 第三节:ES6中另一个不得不说的关键字const