《QT从基础到进阶·二十》QThreadPool线程池的使用

什么情况下比较适合用线程池?
比如我有上百个任务要同时处理,难道开上百个线程?NO!!!
有了线程池的加持,自动给任务分配线程处理, 多线程不再是真爱~

线程池创建:
1、自定义任务类继承QObject,QRunnable
2、重写run方法
在把任务类放进线程池后,线程池中的线程会调用任务类中的run方法执行任务。

#include <QObject>
#include <QRunnable>
class ParallelSave : public QObject, public QRunnable
{
Public:void run();
}

在这里插入图片描述
setAutoDelete(true)设置true表示这个任务对象在被线程池中的线程运行完后任务对象自动走析构销毁,不需要手动delete,设置为false表示需要手动销毁任务对象,默认为true
threadPool.setMaxThreadCount(9); //设置线程池中最多可以启动的线程数,比如设置2表示同一时间最多能启动两个线程,如果我有三个任务需要做,那同一时间只能做两个任务,剩下的一个任务需要等到两个线程中的一个线程做完上个任务才能做这个
如果有三个线程,三个任务,并不是每个线程一个任务,有可能一个线程两个任务,一个线程一个任务,还有一个线程空闲。

QThreadPool threadPool; //创建线程池对象
threadPool.setMaxThreadCount(9); //非单例,自己创建线程池对象,该线程池包含9个线程
m_paralleSave = new ParallelSave(); //创建一个可以在线程池中执行的任务对象,多个任务同时进行就要创建多个对象,在每个任务对象run方法中调用QThread::currentThread()可以查看当前任务被哪个线程ID执行。
threadPool.start(m_paralleSave); //把一个任务对象放进线程池缓存队列,等待被池中线程执行。
threadPool.activeThreadCount(); //当前线程池中正在执行任务的线程的个数,所有任务执行完毕返回0
// 线程池中被激活的线程的个数(正在工作的线程个数)
int QThreadPool::activeThreadCount() const;
int QThreadPool::waitForDone();  //阻塞当前线程池等待线程池中所有任务被线程执行完毕

注意:
线程池中setMaxThreadCount设置最大线程数为CPU逻辑核心数量,比如CPU是4核8线程,那么开8个线程可以达到最佳性能。
线程池通过调用start函数把所有任务都放置到缓存队列中,这时所有任务并不是立刻执行,线程池会根据任务数量自动创建线程,任务会被合理分配到各个线程上执行,但总线程数量不会超过设置的最大线程数。
若任务处理完毕,池内所有线程处于挂起状态,不占用CPU时间,待任务再次到来便会激活部分或全部线程处理任务。
若任务过多,当前没有空闲线程,新增任务会被放到缓存队列,等线程空闲后在进行处理。设计高性能程序时离不开线程池加持。

简单说下另一个类似线程池的应用
QFutureSynchronizer<任意类型>使用(所有线程异步执行,可以设置同步结束)和线程池很像
QFutureSynchronizer 是一个模板类,它简化了一个或多个 QFuture 对象的同步。

#include <QtConcurrent>  //问题可在属性——Qt project settings中加上

在这里插入图片描述
for循环让多个线程一起执行Block.addFuture中的任务,多个线程异步执行,Blcok.waitForFinished()保证所有线程全部执行完毕才跳到这一步。results保存所有线程返回的结果。

在这里插入图片描述

📢博客主页: 主页
📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📢本文由 梦回阑珊 原创,首发于 CSDN,转载注明出处🙉
📢代码改变世界,你来改变代码!✨

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/176119.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第 117 场 LeetCode 双周赛题解

A 给小朋友们分糖果 I 动态规划&#xff1a;设 p [ k ] [ i ] p[k][i] p[k][i] 为将 i i i 个糖果分给 k k k 个小朋友的方案数&#xff0c;先求 p [ 2 ] [ i ] p[2][i] p[2][i] &#xff0c;再求 p [ 3 ] [ n ] p[3][n] p[3][n] class Solution { public:using ll long …

【Spring进阶系列丨第一篇】初识Spring开发

前言 小伙伴们大家好&#xff0c;我是陈橘又青&#xff0c;今天起 《Spring进阶系列》 开始更新。本专栏将涵盖Spring框架的核心概念、配置管理、Web开发、AOP、Boot、Security、Data、Integration和Batch等多个主题。通过理论讲解和实际案例的剖析&#xff0c;帮助读者深入理解…

R语言编写代码示例

R语言编写的爬虫程序&#xff0c;使用了requests库来发送请求&#xff0c;使用BeautifulSoup库来解析HTML。 r # 第一步&#xff0c;安装必要的库 install.packages("xml2") install.packages("requests") install.packages("httr") install.pac…

【SQLite】环境安装

SQLite - C/C SQLite简介 SQLite 是一种轻量级的嵌入式数据库引擎&#xff0c;它在程序中直接访问数据库文件而不需要独立的数据库服务器。以下是一些关于 SQLite 的简介信息&#xff1a; 嵌入式数据库引擎&#xff1a; SQLite 是一种嵌入式数据库引擎&#xff0c;这意味着它…

打造全身视角的医院可视化能源监测管理平台,实现医院能源可视化管理

医院是大型公共建筑的一种&#xff0c;随着医院规模的不断扩大&#xff0c;医院能源消耗剧增&#xff0c;能源消耗居高不下。医院对于能源监管的需求也越来越高。医院建立一套能耗监测管理平台&#xff0c;对于降低医院能耗有着非常重要的作用。 医院能耗存在的问题 1、医院能…

Please No More Sigma(构造矩阵)

Please No More Sigma 给f(n)定义如下&#xff1a; f(n)1 n1,2; f(n)f(n-1)f(n-2) n>2; 给定n&#xff0c;求下式模1e97后的值 Input 第一行一个数字T&#xff0c;表示样例数 以下有T行&#xff0c;每行一个数&#xff0c;表示n。 保证T<100&#xff0c;n<100000…

为什么打开idea时,没有启动页面,如何解决?

更新idea2021.2后&#xff0c;当双击idea打开时&#xff0c;发现没有启动界面&#xff0c;直接进入IDEA界面&#xff0c;中间等待时间&#xff0c;让人误以为没有打开idea成功&#xff0c;使得多次点击idea图标。 解决方案就是 在idea界面菜单栏中找到帮助&#xff08;Help)&a…

时序数据库 TDengine + 高级分析软件 Seeq,助力企业挖掘时序数据潜力

作为一款制造业和工业互联网&#xff08;IIOT&#xff09;高级分析软件&#xff0c;Seeq 支持在工艺制造组织中使用机器学习创新的新功能。这些功能使组织能够将自己或第三方机器学习算法部署到前线流程工程师和主题专家使用的高级分析应用程序&#xff0c;从而使单个数据科学家…

【洛谷算法题】P5711-闰年判断【入门2分支结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5711-闰年判断【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格式&a…

【PTQ】Cross-Layer Equalization跨层均衡-证明和实践详细解读

Cross-Layer Equalization跨层均衡 aimet解读 符合规则的模型结构 统一要求&#xff1a;单数据流&#xff0c;中间激活不流向其他地方概念说明&#xff1a; Conv: gruoups1的普通卷积&#xff0c;包括TransposedConv和ConvDepthwiseConv: 深度可分离卷积&#xff0c;groupsi…

王道数据结构课后代码题p40 6.有一个带头结点的单链表L,设计一个算法使其元素递增有序 (c语言代码实现)

这一题其实用到了直接插入排序的思想 视频讲解在这里哦&#xff1a;&#x1f447; p40 第6题 王道数据结构课后代码题 c语言代码实现_哔哩哔哩_bilibili 本题代码为 void paixu(linklist* L)//对单链表内的元素排序 {lnode* p (*L)->next;lnode* pre *L;lnode* r p-&…

【ArcGIS Pro微课1000例】0032:创建具有指定高程Z值的矢量数据

本文讲解ArcGIS Pro中创建具有指定高程值的矢量数据的两种方法。 文章目录 一、独立创建1. 新建地图场景2. 新建shapefile3. 绘制多边形4. 添加高程字段5. 三维显示二、基于高程源创建1. 创建栅格范围2. 添加Z值字段3. 添加Z信息4. 要素更新Z值一、独立创建 1. 新建地图场景 …