Qt QThreadPool线程池

1.简介

QThreadPool类管理一个QThread集合。
QThreadPool管理和重新设计单个QThread对象,以帮助降低使用线程的程序中的线程创建成本。每个Qt应用程序都有一个全局QThreadPool对象,可以通过调用globalInstance来访问该对象。
要使用其中一个QThreadPool线程,请子类化QRunnable并实现run虚拟函数。然后创建该类的一个对象,并将其传递给QThreadPool::start。

主要特点:

  • 线程复用:线程池中的线程可以重复使用,减少了线程创建和销毁的开销。
  • 资源管理:线程池可以帮助管理线程的生命周期,包括线程的创建、销毁和线程数的控制。
  • 任务队列:线程池通常与一个任务队列一起使用,允许你将任务添加到队列中,由线程池中的线程执行。

2.常用方法

  • globalInstance(): 获取全局的 QThreadPool实例。
  • maxThreadCount(): 获取线程池中最大线程数。
  • setMaxThreadCount(int): 设置线程池中最大线程数。
  • activeThreadCount(): 获取当前活跃的线程数。
  • expiryTimeout(): 获取线程的最长存活时间。
  • setExpiryTimeout(int): 设置线程的最长存活时间。
  • start(QRunnable *): 将一个 QRunnable 对象添加到线程池的任务队列中,并在线程池中的一个线程上执行它。
  • tryStart(QRunnable *): 尝试立即在一个空闲线程上执行 QRunnable 对象,如果失败则返回 false
  • waitForDone(int): 阻塞调用线程,直到所有任务执行完毕或超时。
  • clear(): 清空任务队列,停止所有正在执行的任务。
  • releaseThread(): 通知线程池当前线程已经完成了一个任务,可以重新被使用。

3.示例

我们创建了一个简单的 QRunnable 子类 MyRunnable,并在主函数中使用了 QThreadPool 来执行 4 个任务。我们设置了线程池的最大线程数为 4,这意味着同时最多有 4 个线程在执行任务。其他的任务会在线程池中的线程变为可用时被执行。

#include "widget.h"
#include "ui_widget.h"
#include <QRunnable>
#include <QThreadPool>
#include <QDebug>
#include <QMutex>
#include <QList>QList<int> g_list;
QMutex g_mutex;class MyRunnable : public QRunnable
{
public:void run() override{while(true){g_mutex.lock();if(g_list.size() == 0){g_mutex.unlock();break;}qDebug() << "Task running in thread:" << QThread::currentThread() << "deal num "<<g_list.first();g_list.pop_front();g_mutex.unlock();}qDebug() << "Task running in thread:" << QThread::currentThread() << "finished ";}
};Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);for(int i=0;i<20;i++){g_list.append(i);}QThreadPool::globalInstance()->setMaxThreadCount(4);for (int i = 0; i < 4; ++i){MyRunnable *r = new MyRunnable();r->setAutoDelete(true);QThreadPool::globalInstance()->start(r);}
}Widget::~Widget()
{delete ui;
}

运行结果:

4.更多推荐

libVLC 专栏介绍-CSDN博客

Qt+FFmpeg+opengl从零制作视频播放器-1.项目介绍_qt opengl视频播放器-CSDN博客

QCharts -1.概述-CSDN博客

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

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

相关文章

深入浅出:ChatGPT的训练与优化之道

近年来&#xff0c;自然语言处理领域中出现了一种引人注目的模型——ChatGPT。这种基于GPT&#xff08;Generative Pretrained Transformer&#xff09;架构的模型&#xff0c;在多轮对话任务中展示了卓越的性能&#xff0c;使其能够产生人类水平的文本&#xff0c;并应用于各种…

深度学习入门(4)

神经网络的构建 import numpy as np import matplotlib.pyplot as plt def sigmoid(x):return 1/(1np.exp(-x)) def identity_function(x):#恒等函数return x def init_network():#进行权重和偏置的初始化&#xff0c;并保存到字典中network{}network[W1]np.array([[0.1,0.3,0…

UniApp 中的路由守卫与拦截器:守护应用的每一步

正文&#xff1a; 路由守卫和拦截器在前端开发中扮演着重要的角色&#xff0c;它们可以用来控制页面访问权限、全局请求拦截等。在 UniApp 中&#xff0c;路由守卫和拦截器同样具有强大的功能&#xff0c;能够保护应用的安全和稳定性。本文将深入探讨 UniApp 中的路由守卫和拦…

【ARM Cache 系列文章 12 – Cache Tag与 物理地址】

文章目录 Cache Tag 和 物理地址缓存的关键组成部分和功能Cache 与 MMUCache Tag 和 物理地址 在ARM架构中,缓存(Cache)的设计是提高数据访问效率的关键机制。每个缓存行(Cache Line)都有一个与之关联的标签(Tag),该标签记录了与该行相关联的外部存储器的物理地址。缓…

关于Android优化

Android优化是一个复杂且多方面的过程&#xff0c;涉及到应用程序的各个方面&#xff0c;包括性能、用户体验、安全性等。以下是对Android优化的详细阐述&#xff0c;包括优化策略、优化方法以及优化工具&#xff0c;并辅以具体的案例或示例。 优化策略 一、用户体验优化 用…

ezplot--Matlab学习

目录 一、代码 二、效果 ​编辑 三、ezplot讲解 四、如何自定义一个函数 一、代码 clc; clear; t0:32; x4(t) cos(2*pi*t/4).*sin(2*pi*t/4); x8(t) cos(2*pi*t/8).*sin(2*pi*t/8); x16(t) cos(2*pi*t/16).*sin(2*pi*t/16); subplot(3,1,1) ezplot(x4,[0,32]); subplot…

POCEXP编写—多线程

POC&EXP编写—多线程 1. 前言2. 多进程&多线程2.1. 多进程2.1.1. 案例 2.2. 多线程2.2.1. 案例&#xff1a; 2.3. POC的案例&#xff08;模板&#xff09; 3. UA头设置3.1. 随机UA头3.1.1. 案例3.1.2. 模板拼接 4. 代理Proxy4.1. 单代理案例4.2. 多代理案例4.2.1. 请求…

【AI心理咨询应用】继Woebot之后,国内诞生的“LLM+CBT”应用:白小喵

导言 AI认知行为疗法&#xff08;Cognitive Behavioral Therapy&#xff0c;CBT&#xff09;早在2017年便有了首例&#xff0c;即美国知名CBT治疗机器人Woebot。 然而&#xff0c;Woebot在CBT的完整落地上仍有缺陷问题&#xff0c;LLM的出现促进了对该问题的解决&#xff0c;…

逻辑填空。

文章目录 句子与填空间的逻辑与搭配 并 符合 文意23省直&#xff1a;侧重搭配21省直&#xff1a;侧重搭配20省直&#xff1a;搭配辨析19/10省直19/8省直17省直词语辨析与搭配置若罔闻/熟视无睹横跨/跨越/横亘征程/征途激活/刺激监管/监督/管理曲径通幽/千回百转消散/淹没/消弭/…

【机器学习基础1】什么是机器学习、预测模型解决问题的步骤、机器学习的Python生态圈

文章目录 一. 什么是机器学习1. 概念2. 机器学习算法分类 二. 利用预测模型解决问题的步骤三. 机器学习的Python生态圈 一. 什么是机器学习 1. 概念 机器学习&#xff08;Machine Learning&#xff0c;ML&#xff09;是一门多领域的交叉学科&#xff0c;涉及概率论、统计学、…

设计模式学习笔记 - 项目实战三:设计实现一个支持自定义规则的灰度发布组件(设计)

概述 上篇文章&#xff0c;我们介绍了灰度组件的一个需求场景&#xff0c;将公共服务平台的 RPC 接口&#xff0c;灰度替换为新的 RESTful 接口&#xff0c;通过灰度逐步放量&#xff0c;支持快速回滚等手段&#xff0c;来规避代码质量问题带来的不确定性风险。 跟前面两个框…

服务器数据恢复—Storwize V3700存储数据恢复案例

服务器存储数据恢复环境&#xff1a; 某品牌Storwize V3700存储&#xff0c;10块硬盘组建了2组Mdisk加入到一个存储池中&#xff0c;一共创建了1个通用卷来存放数据&#xff0c;主要数据为oracle数据库。 服务器存储故障&#xff1a; 其中一组Mdisk中两块磁盘出现故障离线&…

【每日刷题】Day28

【每日刷题】Day28 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; ​ 1. 121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09; 2. 205. 同构字符串 - 力扣…

解决python file.read()读取文件为空报错

问题描述 今天写的python脚本出现了file.read()读不到文件内容的问题&#xff0c;原脚本如下&#xff1a; with open(path,r) as f:znre.compile(rZN ZN)znallzn.findall(f.read())if len(znall) 1:list2.append(id)for i in list1:#print(f.read())if i in f.read():lis…

如何写得一手优雅规范的SpringBoot 接口?

导语 优雅的代码赏心悦目&#xff0c;你的代码触目惊心。 当编写 Spring Boot 接口时&#xff0c;优雅和规范是至关重要的。一个良好设计的接口能够提高代码的可读性、可维护性和可扩展性&#xff0c;从而为整个应用程序的开发和维护带来便利。 在本文中&#xff0c;我们将探讨…

关于discuz论坛网址优化的一些记录(网站地图sitemap提交)

最近网站刚上线&#xff0c;针对SEO做了些操作&#xff0c;为了方便网站网页百度被收录&#xff0c;特此记录下 discuz有免费的sitemap插件可以用&#xff0c;打开后台管理&#xff0c;找到插件栏&#xff0c;然后找到更多插件&#xff0c;进入插件市场。 选择这个免费的sitem…

【数据分析面试】34.填充NaN值 (Python:groupby/sort_value/ffill)

题目&#xff1a;填充NaN值 &#xff08;Python) 给定一个包含三列的DataFrame&#xff1a;client_id、ranking、value 编写一个函数&#xff0c;将value列中的NaN值用相同client_id的前一个非NaN值填充&#xff0c;按升序排列。 如果不存在前一个client_id&#xff0c;则返…

Linux详解:进程等待

文章目录 进程等待等待的必要性进程等待的方法waitwaitpid获取子进程status阻塞等待 与 非阻塞等待 进程等待 等待的必要性 子进程退出&#xff0c;父进程不进行回收的话&#xff0c;就可能造成僵尸进程&#xff0c;进而造成内存泄露 如果进程进入了僵尸状态&#xff0c;kill…

Tcp自连接

Tcp自连接 如果客户端和服务端都在同一个环境&#xff0c;并且客户端先于服务端启动&#xff0c;那么很有可能产生自连接的现象。 所谓自连接&#xff0c;就是tcp两端使用了同一个端口进行连接&#xff0c;即localhost:port->localhost:port。 实现自连接 下面提供一个例…

GITEE 基于OAuth2的API V5版本

为了构建更好的码云生态环境&#xff0c;我们推出了基于OAuth2的API V5版本。 API V5接口使用方式以及Url都参照GitHub&#xff0c;为了各位开发者更好的兼容已经存在的第三方应用。 API 使用条款 OSCHINA 用户是资源的拥有者&#xff0c;需尊重和保护用户的权益。不能在应用…