1.为什么要使用线程池

每次创建线程需要向系统申请资源,线程切换时操作系统会切换线程上下文,可能会从用户态切换到内核态,当有很多线程时,频繁地切换线程会导致消耗大量的 CPU 以及内核资源,反而会降低程序的效率。

2.线程池的作用

线程并不是越多越好,线程池的作用是管理复用回收一组线程,控制线程的数量,避免频繁的创建和销毁线程而浪费资源

3.线程池的工作流程

4.线程池的使用步骤
QThreadPool类为Qt提供的线程池函数,使用此类只需要配置线程池的最大线程数量、线程长时间不使用的过期时间等参数,不需要进行QThread相关的操作。
QThreadPool 管理和回收各个 QThread 对象,以帮助减少使用线程的程序中的线程创建成本。每个Qt应用程序都有一个全局 QThreadPool 对象,可以通过调用 globalInstance() 来访问它。也可以单独创建一个 QThreadPool 对象使用。

要使用线程池中的一个线程,只需要两步:

  • 子类化 QRunnable 并实现 重写虚函数run() 。
  • 调用函数 start() 启动线程。

示例:

//1.子类化QRunable并重写run函数
class CMyRunable : public QRunable
{public:CMyRunable() : QRunable(){this->setAutoDelete(false);}//重写run函数void run(){qDebug()<<"threadid: "<<QThread::currentThreadId()<<"this:"<<this;}
}
//2.启动线程
QThreadPool * pThreadPool  = QThread::globalInstance();
if(pThreadPool)
{pThreadPool->setMaxThreadCount(2);//设置最大线程数为2pThreadPool->setExpiryTimeout(-1);//设置线程永不超时//申请三个线程任务,会有一个线程任务被放入队列等待其他线程执行完毕后执行for(int i=0;i<3;i++){CMyRunable *pMyRun = new CMyRunable();pThreadPool->start(pMyRun);}pThreadPool->waitForDone();pThreadPool->clear();
}

5.QThreadPool常用操作函数

1.int activeThreadCount() const //当前的活动线程数量2.void clear()//清除所有当前排队但未开始运行的任务3.int expiryTimeout() const//线程长时间未使用将会自动退出节约资源,此函数返回等待时间4.int maxThreadCount() const//线程池可维护的最大线程数量5.void releaseThread()//释放被保留的线程6.void reserveThread()//保留线程,此线程将不会占用最大线程数量,从而可能会引起当前活动线程数量大于最大线程数量的情况7.void setExpiryTimeout(int expiryTimeout)//设置线程回收的等待时间8.void setMaxThreadCount(int maxThreadCount)//设置最大线程数量9.void setStackSize(uint stackSize)//此属性包含线程池工作线程的堆栈大小。10.uint stackSize() const//堆大小11.void start(QRunnable *runnable, int priority = 0)//加入一个运算到队列,注意start不一定立刻启动,只是插入到队列,排到了才会开始运行。需要传入12.QRunnable ,后续介绍13.bool tryStart(QRunnable *runnable)//尝试启动一个14.bool tryTake(QRunnable *runnable)//删除队列中的一个QRunnable,若当前QRunnable 未启动则返回成功,正在运行则返回失败15.bool waitForDone(int?<i>msecs</i>?=?-1)//等待所有线程运行结束并退出,参数为等待时间,-1表示一直等待到最后一个线程退出

Qt之ThreadPool相关推荐

  1. qt下编写linux消息队列,C++11消息队列 + Qt线程池 + QRunnable执行任务简单模型

    1.模板类queue,包含头文件中,是一个FIFO队列. queue.push():在队列尾巴增加数据 queue.pop():移除队列头部数据 queue.font():获取队列头部数据的引用 .. ...

  2. Qt线程之QRunnable的使用详解

    概述 说到线程通常会想到QThread,但其实Qt中创建线程的方式有多种,这里主要介绍其中一种QRunnable,QRunnable和QThread用法有些不同,并且使用场景也有区别.接下来就来看看Q ...

  3. 基于Qt的在线答题系统

    实现功能 : 用户的注册及登录 ,个人答题训练 ,排位赛(网络对战) ,排位赛时发送表情.排位系统.积分榜. 项目描述 : 采用 C/S 结构基于 TCP/IP 协议 ,运用 Libevent 库进行 ...

  4. 使用openCV+Qt+fcgi 为OpenStreetMap瓦片添加热力图图层

    在搭建如OpenStreetMap等瓦片服务器的过程中,我们会关心当前服务器上哪些瓦片已经存在(被渲染了).哪些瓦片被访问量大,哪些少. 统计瓦片的历史记录,可以直接扫描缓存,或者通过数据库来完成.如 ...

  5. QT 中多线程实现方法总结

    第一: 用QtConcurrentRun类,适合在另一个线程中运行一个函数.不用继承类,很方便 第二:用QRunnable和QThreadPool结合.继承QRunnable,重写run函数,然后用Q ...

  6. 基于linux+windows Qt+Mysql 开发的在线答题系统

    目录 一 项目描述 二 段位介绍 三 效果展示 四 服务器代码 1.common.h 2.db.h(数据库类) 3.myserver(处理客户端事件) 4.Tcpserver(监听) 5.Tcpsoc ...

  7. Qt多线程以及线程池

    目录 继承QThread类 简单使用 传递参数 QObject::MoveToThread()函数 QThreadPool线程池 多线程编程其实也不难,重要的是控制共享资源的修改,以及资源的使用权限控 ...

  8. CC++QT开发知识总结

    C/C++/QT开发知识总结 C 存储类型 auto.register.extern.static四种存储类型 auto:修饰局部变量,一般的类型定义默认auto register:寄存器类型,把修饰 ...

  9. QT 中QTimer 和 startTimer()的区别

    最需要注意一点 请注意,QTimer的准确性取决于底层操作系统和硬件.timerType参数允许您自定义计时器的准确性.有关不同计时器类型的信息,请参见Qt::TimerType.大多数平台支持20毫 ...

最新文章

  1. 冠军方案分享:ICPR 2020大规模商品图像识别挑战赛冠军解读
  2. linux 安装tinyxml,使用TinyXml
  3. element upload预览_vue+element上传图片并显示预览图
  4. 保护模式及其编程——8086系统寄存器和系统指令
  5. Entity Framework的事务提交
  6. JS每日一题:Vue中的diff算法?
  7. 机器学习(十)——因子分析
  8. 在加拿大读大学被开除了,以后该怎么办?
  9. Spring Boot学习总结(12)——Spring Boot Admin 2.0应用监控示例
  10. centos7 搭建安装zabbix3.0邮件告警实例(二)
  11. 从细节到宏观的seo方案制定
  12. 迅雷手机版苹果版_2020最新迅雷苹果版如何下载?
  13. android英文菜单,安卓recovery菜单中英文对照
  14. STREAM内存带宽测试工具介绍及其内部实现
  15. 汉字转【pinyin】
  16. c语言中char* 代表什么
  17. FeignException$InternalServerError [500] during [POST]同时出现converter.HttpMessageConversionException
  18. 移动硬盘文件系统错误16389
  19. Mobento:能搜索视频中说过的话
  20. 【春招实习】贝壳金服电话一面

热门文章

  1. 开源免费天气预报接口API以及全国所有地区代码!!(国家气象局提供)_技术成长笔记_新浪博客...
  2. java xsi type_java – JAXB:编组XML上缺少具体类型信息(xsi:type)
  3. fabric基本概念
  4. linux acpi 代码,ACPI简介 Linux
  5. 揭秘,轻松实现日吸1000+精准粉
  6. 短视频推广转到直播领域,探店达人做好直播的秘诀是什么
  7. Eclipse IDE 2020-06 R(4.16.0)发布,正式支持Java 14
  8. 2020低压电工模拟考试及低压电工实操考试视频
  9. SMS短信的C语言代码
  10. 鱼和熊掌可兼得,高定制+低成本的知识管理系统