在 Qt 中,多线程的使用是开发高性能 GUI 应用的重要组成部分。为了避免频繁创建和销毁线程带来的资源消耗,Qt 提供了 线程池(QThreadPool可运行任务(QRunnable 的机制,帮助我们更加高效地管理并发任务。

一、什么是线程池(QThreadPool

线程池是一种线程复用技术,它维护一个线程集合,允许你将多个任务分配给这些线程,而不必为每个任务创建新的线程。

Qt 中的 QThreadPool 提供了一种简洁的方式来调度和管理线程资源。

优势:

  • 避免频繁创建/销毁线程。
  • 提高任务处理效率。
  • 支持任务优先级控制。
  • 简化多线程编程模型。

二、什么是 QRunnable

QRunnable 是 Qt 中的一个轻量级任务接口,用于封装可在线程池中运行的任务。与继承 QThread 不同,QRunnable 更适合执行不需要线程生命周期控制的短小任务。

你只需要继承 QRunnable 并实现 run() 方法,就可以将任务提交给线程池。


三、基本使用示例

下面是一个简单的示例,展示了如何使用 QThreadPoolQRunnable 来执行一个后台任务。

头文件:task.h

#ifndef TASK_H
#define TASK_H#include <QRunnable>
#include <QDebug>
#include <QThread>class Task : public QRunnable {
public:Task(int id) : m_id(id) {// 设置为自动删除,任务执行完成后自动释放内存setAutoDelete(true);}void run() override {qDebug() << "Task" << m_id << "is running on thread:" << QThread::currentThreadId();QThread::sleep(2); // 模拟耗时操作qDebug() << "Task" << m_id << "finished.";}private:int m_id;
};#endif // TASK_H

主程序:main.cpp

#include <QCoreApplication>
#include <QThreadPool>
#include "task.h"int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QThreadPool* pool = QThreadPool::globalInstance();pool->setMaxThreadCount(4);  // 设置最大并发线程数// 启动多个任务for (int i = 0; i < 6; ++i) {Task* task = new Task(i);pool->start(task);}// 等待所有任务完成pool->waitForDone();qDebug() << "All tasks completed.";return 0;
}

四、运行结果示例

运行该程序后,你可能会看到类似如下输出(线程ID可能不同):

Task 0 is running on thread: 0x7f8c46c05700
Task 1 is running on thread: 0x7f8c46404700
Task 2 is running on thread: 0x7f8c45c03700
Task 3 is running on thread: 0x7f8c45402700
Task 0 finished.
Task 4 is running on thread: 0x7f8c46c05700
Task 1 finished.
Task 5 is running on thread: 0x7f8c46404700
...
All tasks completed.

这说明线程池会在现有线程完成任务后复用它们处理新的任务,而不是重复创建线程。


五、补充说明

  • 自动释放:建议使用 setAutoDelete(true),让 QRunnable 在任务完成后自动删除,避免内存泄漏。
  • 最大线程数:可通过 QThreadPool::setMaxThreadCount() 设置线程池并发数,默认是 QThread::idealThreadCount()
  • 任务优先级start() 方法支持传入 int priority 参数,用于设置任务优先级。
pool->start(task, QThread::HighPriority);

六、适用场景

  • 后台数据处理(如文件IO、数据库操作)。
  • 图像或数据的批量处理。
  • 分布式任务执行,GUI 不需等待任务完成。
  • 替代频繁使用 QThread 的复杂场景。

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

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

相关文章

spring-ai-alibaba-deepresearch 学习(五)——BackgroundInvestigationNode

本篇为spring-ai-alibaba学习系列第三十一篇前面介绍 rewrite_multi_query 节点最后会根据用户上传文件标识 user_upload_file 决定下一节点现在来看一下第二个分支&#xff0c;当 user_upload_file 为 false 时&#xff0c;转入 background_investigator 节点该节点主要是负责…

ESP32S3:开发环境搭建、VSCODE 单步调试、Systemview 分析任务运行情况

目标: 实现点灯工程&#xff0c;并且可以基于 vscode 进行单步调试与 systemview 来分析任务运行情况。 环境搭建 如需在 ESP32-S3 上使用 ESP-IDF&#xff0c;请安装以下软件&#xff1a; 设置 工具链&#xff0c;用于编译 ESP32-S3 代码&#xff1b;编译构建工具 —— CMa…

linux系统学习(6.软件包管理)

目录 一、概述 1.分类 2.命名方式 3.一个软件包的组成 1. 软件包的基本定义 2. 一个软件包通常包含的部分 ① 程序文件 ② 库文件 ③ 配置文件 ④ 数据文件 / 资源文件 ⑤ 文档 / 帮助信息 ⑥ 服务脚本 / 单元文件&#xff08;如果是服务型软件&#xff09; ⑦ 包的…

数据结构青铜到王者第八话---队列(Queue)

目录 一、队列(Queue) 1、概念 2、队列的使用 3、队列模拟实现 4、循环队列 4.1数组下标循环的小技巧&#xff08;1&#xff09;下标最后再往后(offset 小于 array.length): index (index offset) % array.length 4.2如何区分空与满 4.3设计循环队列 二、双端队列 (Deq…

Windows系统之不使用第三方软件查看电脑详细配置信息

MENU使用系统信息工具&#xff08;最详细&#xff09;使用命令行查看命令提示符PowerShell&#xff08;信息更丰富&#xff09;使用DirectX诊断工具&#xff08;查看显卡和声音设备&#xff09;查看设备管理器&#xff08;查看硬件驱动&#xff09;一条命令合集&#xff08;Pow…

K8s学习笔记(一)——

一、k8s是什么一个分布式原来是主要用来管理容器的呀&#xff08;专业点叫“容器编排”&#xff09;&#xff0c;什么是管理&#xff1f;其实就是增删改查等等&#xff0c;简单来理解&#xff0c;k8s就是实现容器增删改查的呗。是开源的&#xff0c;在Linux系统下。就跟创建的s…

Zynq开发实践(FPGA之平台免费IP)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】和c语言平台提供posix api一样&#xff0c;一般fpga厂家也会提供各种各样免费的ip给客户使用。这样&#xff0c;客户就不需要自己去写每一个ip了&am…

nginx 配置文件初识全局块、events、http、server、location 的层级关系

Nginx 配置其实只有两类指令&#xff1a; 放在“某个块”里的块级指令&#xff1b;直接写在顶层的全局指令。 把全部配置想象成一个树形结构&#xff0c;根节点叫 main&#xff0c;往下依次分叉即可。下面用 1 张 ASCII 树 1 张极简示例&#xff0c;30 秒就能看懂层级关系。 层…

OCR大模型最新研究

最新OCR大模型介绍1.GPT-4o 2024.5.14 3.MinerU 2024.7.4 3.GOT-OCR 2024.9.3 4.InternVL3-78B 2025.4.11 开源 通用多模态大模型&#xff0c;OCR是它们的能力之一 因其训练数据的偏向&#xff0c;在文档理解、数学公式识别、图表分析等任务上通常是开源模型中的SOTA&a…

php电子签名

原理使用一对公钥和私钥&#xff0c;用私钥对数据进行签名&#xff0c;用公钥对签名数据进行加密&#xff0c;形成电子签名。电子签名认证&#xff0c;用私钥解密数据&#xff0c;用公钥验证签名。若加密容过长&#xff0c;则将加密内容按照固定长度分块&#xff0c;对每块进行…

鸿蒙Harmony-从零开始构建类似于安卓GreenDao的ORM数据库(三)

目录 一,插入单条数据 二,批量插入数据 三,根据条件删除数据 四,传入对象删除数据 五,删除整张表的数据 六,根据条件更新数据 前面两个章节数据库的创建以及数据库表的创建都已经完成了,下面我们再来看看数据库的增删改查如何构建。 一,插入单条数据 我们先来看一下官…

年度优质会议推荐:【西安石油大学主办|IEEE出版|往届均EI】第七届智能控制、测量与信号处理国际学术会议 (ICMSP 2025)

第七届智能控制、测量与信号处理国际学术会议 (ICMSP 2025) 2025 7th International Conference on Intelligent Control, Measurement and Signal Processing (ICMSP 2025) 2025年11月28-30日 中国北京 主办单位&#xff1a;西安石油大学 会议详情&#xff1a;请点击 亮…

isp 图像处理--DPC坏点矫正

一&#xff0c;Bayer pattern简要介绍我们平时所看到的彩色图像每个像素有三个分量组成&#xff0c;分别为红绿蓝。而目前广泛用到的成像传感器为CMOS传感器&#xff0c;其输出的数据格式为每个像素点只有一个颜色分量&#xff0c;一般称为Bayer Pattern数据&#xff0c;格式如…

Redis常见数据类型及应用场景

好的&#xff0c;我们来详细讲解 Redis 的数据结构及其应用场景。Redis 的强大之处不仅仅在于它支持简单的键值对&#xff0c;更在于它提供了丰富的数据结构&#xff0c;每种结构都针对特定类型的应用场景进行了优化。 核心数据结构与应用场景 Redis 主要支持以下五种核心数据结…

【后端数据库】MySQL 索引生效/失效规则 + 核心原理

SQL 优化的核心 —— 什么时候能“走索引”&#xff0c;什么时候会“失效”。整理一个索引生效/失效规则 核心原理的全景图&#xff0c;帮助彻底理解。&#x1f511; MySQL 索引使用的核心原理MySQL 使用 BTree 索引&#xff08;最常见&#xff09;&#xff0c;特点是&#xf…

基于 YOLOv11n 的无人机航拍小目标检测算法学习

基于 YOLOv11n 的无人机航拍小目标检测算法问题&#xff1a;无人机航拍图像中小目标检测面临尺度变化大导致的检测精度较低和推理速度较慢等 解决&#xff1a;在 C3k2 模块中引入可变形卷积&#xff08;DCN&#xff09;&#xff0c;增强模型在复杂背景下对 多尺度目标的特征提取…

第06章:map():数据变形金刚,想变什么变什么

文章目录map()基础&#xff1a;一对一的数据转换map()的工作原理方法引用让代码更简洁对象转换&#xff1a;实际业务应用用户信息转换示例特殊类型的map()&#xff1a;mapToInt、mapToLong、mapToDouble链式map()&#xff1a;多重转换map()与filter()组合&#xff1a;数据处理管…

197-200CSS3响应式布局,BFC

CSS3响应式布局-媒体查询举例<title>01.媒体查询_媒体类型</title><style>h1 {width: 600px;height: 400px;background-image: linear-gradient(60deg,red,yellow,green);font-size: 40px;color: white;text-shadow: 0 0 20px black;text-align: center;line…

[Android] UI进阶笔记:从 Toolbar 到可折叠标题栏的完整实战

学习 Android 开发的过程中&#xff0c;UI 控件往往是最直观也最容易踩坑的部分。本文整理了我在学习《第一行代码》后的实践笔记&#xff0c;涵盖 Toolbar、自定义标题栏、菜单、Snackbar、CoordinatorLayout、可折叠标题栏、SwipeRefreshLayout 下拉刷新、FloatingActionButt…

计算机网络---http(超文本传输协议)

1. HTTP的定义与核心属性 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是万维网&#xff08;WWW&#xff09;的核心通信协议&#xff0c;定义了客户端&#xff08;如浏览器、APP&#xff09;与服务器之间如何传输“超文本”&#xff08…