当前位置: 首页 > news >正文

Qt线程池QThreadPool使用示例

目录

      • 前言
      • 1.线程池原理介绍
      • 2.QThreadPool详细介绍
          • 反复执行同一个任务
          • 设置线程过期时间
          • 线程数量信息
      • 3.QThreadPool示例
      • 4.总结

前言

线程池顾名思义就是同时管理多个线程的"池子",它是一种并发处理技术,在程序中使用线程池能够提高线程的使用效率,提高程序的稳定性。 本文从线程池的实现原理开始,介绍了QT框架里的线程池QThreadPool,并提供一个使用示例。

1.线程池原理介绍

线程池的实现思路大致是这样的,在程序启动时创建一定数量的线程交给线程池管理,它通过一个任务队列来给各个线程分配任务。当需要使用线程处理一些任务时,就把这些任务扔给线程池,让线程池决定这些任务由哪个线程执行。当空闲线程多的时候,线程池可以自动销毁空闲的线程,当线程不够用时线程池也能自动创建新的线程来执行任务。当然了,通常我们会对线程池设置一个最大线程数量。
使用线程池有以下几个好处:

  1. 提高程序效率:由于线程池中已经预先创建了一定数量的线程,因此无需每次都创建和销毁线程,从而降低了系统开销。
  2. 提高响应速度:任务可以很快地分配给线程处理,从而提高了程序的响应速度。
  3. 提高稳定性:使用线程池可以有效地控制系统资源的使用,避免了过度占用系统资源导致系统崩溃或死锁的风险。
  4. 提高可扩展性:线程池的大小可以动态调整,可以根据需要增加或减少线程数量,从而满足不同工作负载的需求。

在这里插入图片描述

2.QThreadPool详细介绍

QThreadPool是一个用于管理线程池的Qt类,它通过管理和复用QThread线程对象来减少线程频繁创建销毁所带来的系统资源消耗。每个Qt应用程序都有一个全局的线程池对象,我们可以通过QThreadPool::globalInstance()单例方法获取。

要使用线程池必须将任务类继承自QRunnable,并实现虚函数run(),例如:

class TaskOne : public QRunnable
{void run() override{qDebug() << "Hello world from thread" << 		QThread::currentThread();}
};TaskOne *task = new TaskOne();
// 默认情况下task归线程池所有,并在执行结束后自动删除。
QThreadPool::globalInstance()->start(task);
反复执行同一个任务

task可以反复执行,前提是在调用QThreadPool::start()函数之前,调用task->setAutoDelete(false),这样task任务执行完后就不会被QThreadPool删除。

设置线程过期时间

QThreadPool中的线程有个默认的过期时间30s,过期后线程会自动退出直到线程的start函数被再次调用。通过调用setExpiryTimeout()设置过期时间,如果设置一个负值,则线程永不过期。

线程数量信息

我们通过调用maxThreadCount()获取线程池中能使用的最大线程数量,该值可以通过setMaxThreadCount()来设置。调用 activeThreadCount()函数获取正在工作的线程数量。

3.QThreadPool示例

下面是一个简单的的QThreadPool应用示例。

#include <QRunnable>
#include <QThreadPool>
#include <QDebug>class MyTask : public QRunnable {
public:MyTask(int id) : id(id) {}void run() override {qDebug() << "Starting task " << id;// Do some workqDebug() << "Finished task " << id;}private:int id;
};int main(int argc, char *argv[])
{QThreadPool::globalInstance()->setMaxThreadCount(4);for (int i = 0; i < 10; ++i) {auto task = new MyTask(i);QThreadPool::globalInstance()->start(task);}QThreadPool::globalInstance()->waitForDone();return 0;
}

在上例中我们设置线程池的最大线程数为4,并循环创建了10个MyTask对象添加到线程池中。最后,我们调用waitForDone()函数等待所有任务完成。具体任务是在MyTask的run函数中执行的,可以通过传递不同的参数来执行不同的任务。

4.总结

QThreadPool的使用场景是执行长时间耗时的工作时。如果需要执行某些任务,又不想阻塞UI线程,我们就可以将这些任务放入线程池中并在后台运行,而不影响UI的响应速度。

QThreadPool的一般使用步骤如下:

  • 1.创建QRunnable的子类来表示要执行的任务。
  • 2.创建QThreadPool对象,并使用setMaxThreadCount()函数设置线程池中的线程数。
  • 3.创建一些QRunnable对象并调用QThreadPool::start()函数将它们添加到线程池中。
  • 4.等待所有任务完成,可以调用waitForDone()函数等待任务完成,也可以通过信号和槽获取任务结束信号。

以上就是本文的所有内容了,有问题欢迎指正,谢谢!

相关文章:

Qt线程池QThreadPool使用示例

目录前言1.线程池原理介绍2.QThreadPool详细介绍反复执行同一个任务设置线程过期时间线程数量信息3.QThreadPool示例4.总结前言 线程池顾名思义就是同时管理多个线程的"池子"&#xff0c;它是一种并发处理技术&#xff0c;在程序中使用线程池能够提高线程的使用效率…...

【Spring】难理解的Aop编程 | 入门?

作者&#xff1a;狮子也疯狂 专栏&#xff1a;《spring开发》 坚持做好每一步&#xff0c;幸运之神自然会驾凌在你的身上 目录一. &#x1f981; 前言二. &#x1f981; 常见概念2.1 常见术语2.2 AOP入门Ⅰ. &#x1f407; 功能场景Ⅱ. &#x1f407; 实现过程2.3 通知类型Ⅰ.…...

2 月 25 日,论道京城 | 云原生开源项目应用实践报名开启

在数字化转型的浪潮中&#xff0c;云原生已经逐渐成为人们关注的焦点。开源社区作为云原生技术创新的根据地&#xff0c;为云原生的产业发展打造了丰富的技术生态圈&#xff0c;也在广泛的实践中源源不断地创造着新的机遇。想知道云原生存储技术实现了怎样的突破吗&#xff1f;…...

第五、六章 贪心算法、回溯算法

贪心算法 适合于贪心算法求解的问题具有&#xff1a;贪心选择性质、最优子结构性质。 贪心算法可以获取到问题的局部最优解&#xff0c;不一定能获取到全局最优解。 贪心算法总是作出在当前看来最好的选择&#xff1b;并且每次贪心选择都能将问题化简为一个更小的与原问题具有…...

k8s-kubectl命令

文章目录一、kubectl 基本命令1、陈述式资源管理方法:2、声明式资源管理办法二、基本信息查看三、项目的生命周期创建kubectl run命令四、金丝雀发布(Canary Release)——陈述式管理方法五、声明式管理方法kubectl create 和 kubectl apply区别一、kubectl 基本命令 1、陈述式…...

36、基于51单片机频率计 LCD 1602显示系统设计

摘要 数字频率计是一种基本的测量仪器。它被广泛应用于航天、电子、测控等领域&#xff0c;还被应用在计算机及各种数学仪表中。一般采用的是十进制数字&#xff0c;显示被测信号频率。基本功能是测量正弦信号&#xff0c;方波信号以及其他各种单位时间内变坏的物理量。由于其…...

【vue】elemente-ui table toggleRowSelection 默认选择无效[已解决]

项目场景&#xff1a; 点击按钮&#xff0c;弹出一个弹出框&#xff0c;内部出现一个table表&#xff0c;表内数据是动态获取&#xff0c;同时得勾选上几个table表的数据&#xff0c;类似以下的图 问题描述 点击按钮显示弹出框&#xff0c;加载table中的数据&#xff0c;默…...

SpringMVC DispatcherServlet源码(5) HttpMessageConverter扩展

前文通过阅读源码&#xff0c;深入分析了DispatcherServlet及相关组件的工作流程&#xff0c;本文不再阅读源码&#xff0c;介绍一下扩展HttpMessageConverter的方式。 HttpMessageConverter工作方式及扩展方式 前文介绍过&#xff0c;HttpMessageConverter是读写请求体和响应…...

day16_API

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、String 三、StringBuffer&StringBuilder 四、日期 零、 复习昨日 见晨考 一、String String代表字符串,类,java程序中的所有字符串&…...

十二月券商金工精选

✦研报目录✦ ✦简述✦ 按发布时间排序 华宝证券 主动暴露的得与失—从Barra框架到私募指增因子分析方法 发布日期&#xff1a;2022-12-01 关键词&#xff1a;股票、Barra、风险暴露、指数增强 主要内容&#xff1a;本文针对私募指数增强产品的策略流程&#xff0c;设计…...

JUnit

Junit 简介 JUnit是一个开源的java单元测试框架&#xff0c;它是XUnit测试体系架架构的一种体现 是Java语言事实上的标准单元测试库真正的优势来自于JUnit所采作用的思想和技术&#xff0c;而不是框架本身。推动了单元测试、测试先行的编程和测试驱动的开发JUnit衍生了许多xUn…...

MySQL学习笔记4-乐观锁和悲观锁

1.定义 乐观锁和倍灌水是并发控制采用的技术手段&#xff0c;确保当多个数位同时对数据中同一数据存取时&#xff0c;不会破坏事物的隔离性、统一性和数据库统一性 乐观锁 假定不会发生并发冲突&#xff0c;只在提交操作时检测是否违反数据完整性 实现方式&#xff1a; 记录…...

踩大坑:json格式存储wav二进制内容

需求描述&#xff1a; 需要将wav音频文件以二进制的形式读出&#xff0c;存放到 json 中&#xff0c;发送post请求到服务&#xff0c;服务解析json&#xff0c;得到二进制内容后放进ASR模型得出转录结果。 记一次坑&#xff1a; # 将wav以二进制形式读出存放到json中 f ope…...

加入CSDN的一年,我收获了这些……

加入CSDN的一年&#xff0c;我收获了这些……加入CSDN的一年&#xff0c;我收获了这些……加入CSDN的一年&#xff0c;我收获了这些…… &#x1f680;&#x1f680;时光如白驹过隙般&#xff0c;飞逝而过。一转眼&#xff0c;我就已经是一名大二的学生了&#xff0c;也已经在…...

【Python学习笔记】44.Python3 MongoDB和urllib

前言 本章介绍Python的MongoDB和urllib。 Python MongoDB MongoDB 是目前最流行的 NoSQL 数据库之一&#xff0c;使用的数据类型 BSON&#xff08;类似 JSON&#xff09;。 PyMongo Python 要连接 MongoDB 需要 MongoDB 驱动&#xff0c;这里我们使用 PyMongo 驱动来连接。…...

LVS中的keepalived高可用

文章目录前言一、Keepalived简介二、keepalived工作原理三、配置文件四、实验1.某台Real Server down2.LVS本身down实验过程&#xff1a;五、代码详细演示整体过程调度器安装软件、设置测试keepalived对后端RS的健康检测backup服务主机设置前言 一、Keepalived简介 Keepalived是…...

【Vue3】组件数据懒加载

组件数据懒加载-基本使用 目标&#xff1a;通过useIntersectionObserver优化新鲜好物和人气推荐模块 电商类网站&#xff0c;尤其是首页&#xff0c;内容有好几屏&#xff0c;而如果一上来就加载所有屏的数据&#xff0c;并渲染所有屏的内容会导致首页加载很慢。 数据懒加载&a…...

基于 SmartX 分布式存储的 iSCSI 与两种 NVMe-oF 技术与性能对比

作者&#xff1a;深耕行业的 SmartX 金融团队本文重点SmartX 分布式块存储 ZBS 提供 2 种存算分离架构下的数据接入协议&#xff0c;分别是 iSCSI 和 NVMe-oF。其中&#xff0c;iSCSI 虽然具有很多优势&#xff0c;但不适合支持高性能的工作负载&#xff0c;这也是 SmartX 选择…...

Anaconda 安装 Pytorch

下载Anaconda,最新版本的即可,默认安装,最好不要安装在C盘,否则后面C盘容量会很大。 安装Pytorch 打开 Anaconda Prompt ,先切换镜像源为国内清华镜像源,这样安装包的时候下载速度会快一些,也容易成功一些。 在 Anaconda Prompt 命令行依次输入以下四条命令切换到清华镜…...

从零开始使用MMSegmentation训练Segformer

从零开始使用MMSegmentation训练Segformer 写在前面&#xff1a;最新想要用最新的分割算法如&#xff1a;Segformer or SegNeXt 在自己的数据集上进行训练&#xff0c;但是有不是搞语义分割出身的&#xff0c;而且也没有系统的学过MMCV以及MMSegmentation。所以就折腾了很久&am…...

会利用信息差赚钱的人才是聪明人

毕业后找不到工作&#xff0c;穷到只剩下时间&#xff0c;大小做了20多份副业兼职&#xff0c;终于找到了可靠的渠道&#xff0c; 我是专科生&#xff0c;学历不好&#xff0c;专业拉胯。毕业后&#xff0c;我找了两三份工作。要么工资太低&#xff0c;只能交房租&#xff0c;…...

【机器学习】Adaboost

1.什么是Adaboost AdaBoost&#xff08;adapt boost&#xff09;&#xff0c;自适应推进算法&#xff0c;属于Boosting方法的学习机制。是一种通过改变训练样本权重来学习多个弱分类器并进行线性结合的过程。它的自适应在于&#xff1a;被前一个基本分类器误分类的样本的权值会…...

深度学习神经网络基础知识(二)权重衰减、暂退法(Dropout)

专栏&#xff1a;神经网络复现目录 深度学习神经网络基础知识(二) 本文讲述神经网络基础知识&#xff0c;具体细节讲述前向传播&#xff0c;反向传播和计算图&#xff0c;同时讲解神经网络优化方法&#xff1a;权重衰减&#xff0c;Dropout等方法&#xff0c;最后进行Kaggle实…...

[面试直通版]网络协议面试核心之HTTP,HTTPS,DNS-DNS安全

点击->计算机网络复习的文章集<-点击 目录 典型问题&#xff1a; 部分现象 DNS劫持 DNS欺骗 DDoS攻击 典型问题&#xff1a; 什么是DNS劫持&#xff0c;DNS欺骗&#xff0c;是什么原理如何防范DNS攻击&#xff1f; 部分现象 错误域名解析到纠错导航页面错误域名解析…...

【OJ】A+B=X

&#x1f4da;Description: 数列S中有n个整数&#xff0c;判断S中是否存在两个数A、B&#xff0c;使之和等于X。 ⏳Input: 第一行为T&#xff0c;输入包括T组测试数据。 每组数据第一行包括两个数字n和X&#xff0c;第二行有n个整数&#xff0c;表示数列S&#xff0c;(1&l…...

Python实现性能自动化测试,还可以如此简单

Python实现性能自动化测试&#xff0c;还可以如此简单 目录&#xff1a;导读 一、思考❓❔ 二、基础操作&#x1f528;&#x1f528; 三、综合案例演练&#x1f528;&#x1f528; 四、总结&#x1f4a1;&#x1f4a1; 写在最后 一、思考❓❔ 1.什么是性能自动化测试? 性…...

Leetcode力扣秋招刷题路-0080

从0开始的秋招刷题路&#xff0c;记录下所刷每道题的题解&#xff0c;帮助自己回顾总结 80. 删除有序数组中的重复项 II 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长…...

Java实现JDBC工具类DbUtils的抽取及程序实现数据库的增删改操作

封装DbUtils 工具类 不知道我们发现没有&#xff0c;不管是对数据库进行查询&#xff0c;还是标准的JDBC 步骤&#xff0c;其开端都是先实现JDBC 的加载注册&#xff0c;接着是获取数据库的连接&#xff0c;最后都是实现关闭连接&#xff0c;释放资源的操作。那我们何不直接把…...

【docker】拉取镜像环境报错解决#ERROR: Get https://registry-1.docker.io/v2/

&#x1f341;博主简介   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; 文章目录问题报错原因解决方法问题 ERROR…...

java中NumberFormat 、DecimalFormat的介绍及使用,java数字格式化,BigDecimal数字格式化

文章目录前言一、NumberFormat1、概述2、实例化方法3、货币格式化4、百分比格式化5、NumberFormat的坑5.1、不同的格式化对象处理相同数值返回结果不同问题源码分析&#xff1a;二、DecimalFormat1、概述2、常用方法3、字符及含义0与#的区别分组分隔符的使用“%” 将数字乘以10…...

如何查询网站备案信息/中囯联通腾迅

本月合计、本年累计...

网站建设独立/推广服务公司

本篇文章主要介绍了深入理解Commonjs规范及Node模块实现&#xff0c;小编觉得挺不错的&#xff0c;现在分享给大家&#xff0c;也给大家做个参考。一起跟随小编过来看看吧前面的话 Node在实现中并非完全按照CommonJS规范实现&#xff0c;而是对模块规范进行了一定的取舍&#x…...

网站定制论文1500字左右/推广公司产品

问题&#xff1a;我在视图画的图象或者文字&#xff0c;当窗口改变后为什么不见了&#xff1f;OnDraw()和OnPaint()两个都是解决上面的问题&#xff0c;有什么不同&#xff1f; 答&#xff1a;OnDraw()和OnPaint()好象兄弟俩&#xff0c;因为它们的工作类似。至于不见了的问题…...

广州推广型网站建设/制作网页的流程步骤

路由器之家网今天精心准备的是《在线闪字》&#xff0c;下面是详解&#xff01;闪字在线制作有没有那种一笔一笔写出来的闪字&#xff1f;或者能制作很可爱很温暖闪字的网站&#xff1f;很急啊&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;...有没…...

dede网站地图不显示文章列表/百度seo 优化

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼{printf("请输入正确日期&#xff01;/n");goto aaa;}}int LeapYear(int intoYear,int intoMonth,int intoDay)//闰年计算{int today;switch(intoMonth){case 1:today0;break;case 2:today31;break;case 3:today60;break…...

日本做动漫软件视频网站/seo是指什么

以2008R2 SQL为例 1、 在开始/管理工具里打开系统的监视器 新建数据收集器 输入名称 添加监视项 添加项 输入保存的目录 创建完成后启动监视器 1、 打开SQL server Profiler跟踪服务 新建跟踪项 运行一段时间后保存 关闭窗口&#xff0c;再打开这个跟踪日志&#xff0c;并导入之…...