news 2026/4/28 10:13:54

QtC++使用QRunnable+QThreadPool管理多线程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
QtC++使用QRunnable+QThreadPool管理多线程

本文的示例项目工程在文章最后有分享链接,可以下载运行试试。下载后替换成自己的Qt版本即可(项目 -> 属性 -> 配置属性 -> Qt Project Settings -> Qt Installation)

应用场景介绍

现有一个应用场景,需要进行上千个循环里面,调用相同的功能类去计算,只使用一个线程去计算,效率太低,结合网络上的帖子和自身实践。我的实现场景如下:

  1. 界面类Dialog。给用户提供交互操作
  2. 计算类Logic。执行用户点击后的计算逻辑
  3. 任务类QRunnable。在若干循环里面用于完成指定任务

运行过程

在Qt界面中,用户点击某个控件后,创建一个线程去执行计算操作,避免界面阻塞,陷入卡死。
(这里有个不继承 qthread 使用多线程的方法,提供另一种实现方法思路)

QThread*mThread;//!< 计算类执行的线程Calculate*mCalculate;//!< 计算类,放在mThread线程里面执行,避免界面卡死/************************************************************************//* 上面为成员变量 *//************************************************************************/mThread=newQThread();mCalculate=newCalculate();mCalculate->moveToThread(mThread);// 改变mCalculate的线程依附关系,将计算类放在线程中执行//! 释放堆空间资源,避免内存泄露connect(mThread,&QThread::finished,mThread,&QObject::deleteLater);connect(mThread,&QThread::finished,mCalculate,&QObject::deleteLater);//! 注意:在使用跨线程通信时,参数需要为元数据类型(具体我也解释不清楚,理解是有关 meta 什么的)qRegisterMetaType<CalculateInputStruct>("CalculateInputStruct");// 将结构体 CalculateInputStruct 注册为元数据类型//! 连接其他信号槽,用于触发线程执行槽函数里的任务connect(this,&MultiThreadDemo::StartCalculate,mCalculate,&Calculate::startCalculateSlot,Qt::QueuedConnection);// 默认使用Qt::QueuedConnection,保证槽函数的执行顺序connect(mCalculate,&Calculate::CalculateFinished,this,&MultiThreadDemo::calculate_finished_slot,Qt::QueuedConnection);// 计算完成显示信息connect(mCalculate,&Calculate::UpdateProssorbar,this,&MultiThreadDemo::update_prossorbar_slot,Qt::QueuedConnection);// 每计算一次完一次任务,更新界面进度条mThread->start();// 启动线程,线程默认开启事件循环,并且线程正处于事件循环状态

类似Run函数实现

计算类使用 qthreadpool 线程池实现,这里的任务是独立的,每个计算任务仅使用传递的参数,没有涉及资源共享

voidCalculate::startCalculateSlot(constCalculateInputStruct aInput){autotest_thread_id=QThread::currentThreadId();// 查看当前线程的id和界面类、任务类的id是否相同QThreadPool thread_pool;thread_pool.setMaxThreadCount(aInput.threadMaxCount);// 设置线程池的最大线程数为1for(inti=0;i<aInput.calculateCount;i++){CalculateRunnable*runnable=newCalculateRunnable;runnable->setAutoDelete(true);// 设置任务结束后自动删除thread_pool.start(runnable);//! 设置响应方式为消息队列时,会在emit CalculateFinished(); 后再响应,故这里使用直接响应connect(runnable,&CalculateRunnable::RunnableFinished,this,[&](){emitUpdateProssorbar();},Qt::DirectConnection);}thread_pool.waitForDone();// 等待所有任务完成emitCalculateFinished();}}

结果对比

一个任务类在run函数中的计算为0.5s。可以看出,理论上线程池中还是有效的。

参考

在寻找答案的过程中,看了很多帖子,分享几遍个人觉得质量不错的文章

  1. Qt多线程通信
  2. Qt线程之QRunnable的使用详解
  3. QT 多线程的实现方法以及GUI线程与其他线程间的通信
  4. 【QT】子类化QObject+moveToThread实现多线程
  5. Qt使用多线程的一些心得——1.继承QThread的多线程使用方法

工程示例

  1. 开发环境:Qt5.15.2 + vs2022
  2. csdn链接:https://download.csdn.net/download/weixin_51238542/90291812
  3. 百度网盘链接:https://pan.baidu.com/s/1JkKm6QF1TrFbQbgyaPqZSw?pwd=tvhn
  4. github链接:https://github.com/tianxingithub/MultiThreadDemo
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/28 10:13:51

构建企业级 Agent 指挥官(Orchestrator):路由、仲裁与问责

构建企业级 Agent 指挥官(Orchestrator):路由、仲裁与问责 1. 引入与连接:当多 Agent 协作成为企业新痛点 1.1 从一个真实故障讲起 2024年Q1,国内某头部零售企业发生了一起轰动内部的事故:营销部门上线的「618预热活动页」因包含违反《广告法》的极限词,被监管部门罚款…

作者头像 李华
网站建设 2026/4/28 10:11:16

从风机水泵到伺服驱动:聊聊国产变频器里那些‘标量’与‘矢量’控制模式到底该怎么选?

工业变频器控制模式实战选型指南&#xff1a;从风机水泵到伺服驱动的技术抉择 站在钢铁厂空压机房的轰鸣声中&#xff0c;看着操作台上闪烁的变频器参数&#xff0c;不少工程师都会面临同样的困惑&#xff1a;面对琳琅满目的控制模式选项——V/F、SVC、FOC、DTC——究竟该如何选…

作者头像 李华
网站建设 2026/4/28 10:09:58

如何使用Docsify自定义组件:扩展Markdown语法的完整指南

如何使用Docsify自定义组件&#xff1a;扩展Markdown语法的完整指南 【免费下载链接】docsify &#x1f0cf; A magical documentation site generator. 项目地址: https://gitcode.com/gh_mirrors/do/docsify Docsify是一款神奇的文档网站生成器&#xff0c;它能帮助你…

作者头像 李华
网站建设 2026/4/28 10:09:24

进程的状态

文章目录一、 进程三态模型二、 进程五态模型&#xff08;引入挂起&#xff09;三、 进程控制块&#xff08;PCB&#xff09;四、 练习一、 进程三态模型 进程在生命周期中会经历以下三种基本状态&#xff1a; 状态含义转换条件就绪&#xff08;Ready&#xff09;已获得除CPU…

作者头像 李华
网站建设 2026/4/28 10:09:15

终极Total War模组开发工具:Rusted PackFile Manager完整教程

终极Total War模组开发工具&#xff1a;Rusted PackFile Manager完整教程 【免费下载链接】rpfm Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt6 of PackFile Manager (PFM), one of the best modding tools for Total War Games. 项目地址: http…

作者头像 李华
网站建设 2026/4/28 10:09:14

大恒工业相机 Windows 从零配置Python3.14环境 运行官方例程

大恒工业相机 Windows 从零配置Python3.14环境 运行官方例程一、前言二、第一步&#xff1a;下载并安装Python&#xff08;电脑未安装的情况&#xff09;1. 下载Python安装包2. 安装Python及必要的依赖&#xff08;关键步骤&#xff0c;必看&#xff09;3. 验证Python是否安装成…

作者头像 李华