基于Qt的独立线程创建与多线程执行实验Demo

一、多线程与线程池的应用目的[1][4]

(一)多线程

        一个进程内多个线程并发执行的情况就叫多线程,每一个线程是一个独立的执行流。多线程是一种编程模型,它与处理器无关,与设计机制有关。

        需要多线程的原因包括:

        1. 并行计算。充分利用多处理器内核,提升整体吞吐量,加快执行速度;

        2. 后台任务处理。将后台线程和主线程分离,在特定场景下它是不可或缺的,如响应式用户界面、实时系统等。

(二)线程池

        线程池主要作用是避免创建过多的线程而引发内存溢出问题,因为创建线程还是比较消耗内存的。

        线程池的主要优势:

        1. 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗;

        2. 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行;

        3. 提高线程的客观理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配、调优和监控。

二、认识QThread、QThreadPool和QFuture[1-3][9]

(一)QThread

        在程序运行过程中,一个QThread对象管理一个线程的控制。QThread对象通过成员函数run()执行,默认情况下,run()调用exec()开启一个事件循环并且该事件循环在线程内部运行。

(二)QThreadPool

        一个QThreadPool对象管理和回收单个QThread对象,以降低程序中的线程创建成本。每个Qt应用程序都有一个全局QThreadPool对象,可以通过调用global allinstance()来访问该对象。使用线程池中的其中一个线程,需要实现一个继承QRunnable的类并且重载其中的虚函数run(),然后创建一个实现类的对象实例并通过QThreadPool::start()启动。

(三)QFuture

        QFuture允许多线程同步,协调一个或多个线程的结果在某个时间点汇总并按预期步骤向前推进。其中,QFuture提供了与运行计算进行交互的方法,提供了基于QFutureWatcher信号与槽的方式与运行的任务进行交互等。

多线程同步(串行)

        多线程同步是指,协调多个线程对共享数据的访问,避免出现数据不一致的情况协调各个事件的发生顺序,使多线程在某个点交汇并按预期步骤往前推进(例如某线程需要等另一个线程完成某项工作才能开展该线程的下一步工作)

        识别什么地方需要同步是编写多线程程序的难点,只有准确识别需要保护的数据、需要同步的点,再配合系统或编程语言提供的合适的同步机制,才能编写安全高效的多线程程序。

多线程异步(并行)

        多线程异步是指,允许同一时间处理多个事件。程序调用一个耗时较长的功能时,它并不会阻塞程序的执行流程,程序会继续往下执行,当该功能执行完毕时,程序能够获得执行完毕的消息或能够访问到执行的结果(如果有返回值或需要返回值时)

        多线程异步具有提高程序的响应能力和处理能力,特别适用于IO密集型任务。

三、基于Qt的独立线程执行方法与代码Demo[5-6][8]

        基于Qt C++的软件开发中,多线程之间的通信是通过信号与槽机制实现的。需要注意的是,只有主线程才能操作程序中的窗口对象,默认的线程就是主线程(窗口对象的实例化会默认生成一个线程),自己创建的就是子线程。

(一)基于实现QThread子类进行独立线程创建运行的方法

图1 基于实现QThread子类进行独立线程创建运行的方法图示

        1. 伴随着事件循环实现

         在QThread子类的run()重载函数中调用QThread::exec()可以开启一个本地线程事件循环;通过调用QThread::quit()或QThread::exit()将会终止事件循环;通常为了保证线程的正常结束,会调用QThread::wait()阻塞其他线程以等待该线程中事件处理完后再结束线程;通常基于QThread::start()运行QThread子类线程实例。相关具体内容可详见参考资料[8]。

        1.1 无需实现重载QThread::run()函数的QThread子类创建的独立线程执行方法

        详见参考资料的使用方法2,Qt中多线程的使用 | 爱编程的大丙 (subingwen.cn)。实际上,该方法利用了QThread::run()默认实现QThread::exec()调用的特性。

        1.2 实现启动事件循环的重载QThread::run()函数的QThread子类创建的独立线程执行方法

        详见参考资料[6]的1:47-2:39视频段,人为主动调用QThread::exec()。

        2. 无需借助事件循环实现

        定义一个QThread子类并重载QThread::run()函数(重载时不调用QThread::exec()开启本地线程事件循环),将全部需求代码写入QThread::run()函数中。然后,在主线程中创建一个实例并通过QThread::start()启动该线程即可。该方法需要在主线程中自主管理线程的创建和回收等。

// mythread.h#ifndef MYTHREAD_H
#define MYTHREAD_H#include <QThread>class MyThread:public QThread
{Q_OBJECT //元对象系统元对象声明public:explicit MyThread(QObject *parent = nullptr); // 默认构造函数protected:// 重载的run()方法需要通过QThread::start()在类外部调用void run() override;};#endif // MYTHREAD_H// mythread.cpp#include "mythread.h"MyThread::MyThread(QObject *parent):QThread(parent){}void MyThread::run()
{// 此处写入子线程全部逻辑代码
}// 主线程调用方法MyThread *subThread = new MyThread; // 动态创建子线程
subThread->start();
subThread->quit();                  // 子线程终止管理
subThread->wait();或MyThread subThread;                // 静态创建子线程
subThread.start();
subThread.quit();                  // 子线程终止管理
subThread.wait();

(二)基于QThreadPool进行独立线程管理的方法

        详见参考资料的使用方法,Qt中线程池的使用 | 爱编程的大丙 (subingwen.cn)。

        具体项目代码可详见系列博客/*2*/的绑定资源。

(三)基于QFuture进行独立线程创建运行的方法

        QFuture<void>专门用于不包含任何获取结果返回函数的线程。任何 QFuture<T>也可以分配或复制到 QFuture<void>中,如果只需要状态或进度信息,而不是实际的结果数据,QFuture<void>很有用。具体使用方法可详见参考资料[8]。

/*QFuture使用简单Demo-以管理QFuture<void>线程为例多线程同步需要引入QMutex进行数据控制管理(Mutex.lock()、Mutex.unlock())
*/// 不包含获取结果返回的线程声明
QFuture<void> Concurrent_Thread;// 在主线程调用设计的槽函数
Concurrent_Thread = QtConcurrent::run(this, &MainWindow::Concurrent_Thread_Function);// 用于恢复被暂停的线程函数
Concurrent_Thread.resume(); // 用于暂停和取消的线程函数
Concurrent_Thread.pause();
Concurrent_Thread.cancel();

四、系列博客回顾

        多线程间基于信号与槽机制进行信号传递的方法与代码示例详见系列博客/*1*/,基于QFuture实现多线程同步/异步运行的具体方法解释与项目代码文件详见系列博客/*2*/

参考资料:

[1] 基本功 | 一文讲清多线程和多线程同步 - 美团技术团队 (meituan.com)

[2] 从小白到高手,你需要理解同步与异步 - 知乎 (zhihu.com)

[3] The Difference Between Asynchronous and Multi-Threading | Baeldung on Computer Science

[4] 面试必问的线程池-深入了解线程池的作用及原理_线程工厂什么作用-CSDN博客

[5] Qt 教程 | 爱编程的大丙 (subingwen.cn)

[6] https://www.youtube.com/watch?v=SncJ3D-fO7g(QThread with an event loop)

[7] https://www.youtube.com/watch?v=lTJ-QkC_Sxw(Signals and Slots across Threads)

[8] Assistant 5.15.2 (MSVC 2019 64-bit)(Qt使用文档助手)

[9] https://www.youtube.com/watch?v=W3ec-_7VPeM(Comparison of Qt and STL Multithreading Classes)

系列博客:

/*1*/ Qt的信号槽机制学习一-CSDN博客

/*2*/ 基于Qt的多线程同步和异步运行实验Demo_qt多线程demo-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

电能质量治理产品在分布式光伏电站的应用

1.概述 随着全球对可再生能源需求的不断增长&#xff0c;分布式光伏电站的建设与扩张正迅速发展。然而&#xff0c;在其运行过程中&#xff0c;分布式光伏电站遭遇了一系列挑战&#xff0c;包括企业关口计量点功率因数降低和谐波污染等问题。这些问题不仅影响了光伏电站的运行…

如何解决导入aioredis报错TypeError: duplicate base class TimeoutError的问题(轻松解决,亲测有效)

下面是根据你的要求撰写的文章: 文章目录 📖 介绍 📖🏡 演示环境 🏡📒 aioredis导包报错 📒📝 解决方案📝 小贴士⚓️ 相关链接 ⚓️📖 介绍 📖 最近在使用Python异步redis模块aioredis的时候遇到了一个错误,导包报错提示 TypeError: duplicate base cla…

@Excel若依导出异常/解决BusinessBaseEntity里面的字段不支持导出

今天发现所有实体类继承BusinessBaseEntity里面的这些通用字段不支持导出&#xff0c;debug时发现是这样&#xff1a; 导出效果 这里我把能查到的方法都汇总了&#xff0c;如果你也遇到这个异常&#xff0c;可以去逐步排查 1.先看库里有没有数据 2.看字段名是否对齐 3.所需要…

vue组件在项目中的常用业务逻辑(2)

完成一个项目的模块总体分为四步&#xff1a; 一、先静态页面 静态组件拆分出来 二、发请求(API) 三、vuex三连环 1.导入api里的search模块请求 2.捞那个请求的数据 先用async和await 再传值给result&#xff0c;添加空对象&#xff0c;派发actions&#xff1a; 3.在mutatio…

气膜球幕展览馆:引领展示新风潮,震撼视界—轻空间

随着展览行业的不断发展&#xff0c;越来越多的创意场地应运而生&#xff0c;而气膜球幕展览馆凭借其独特的球形外观和创新的结构设计&#xff0c;迅速成为展览和活动行业中的新宠。无论是艺术展览、品牌展示&#xff0c;还是各种大型活动&#xff0c;气膜球幕展览馆都以其极具…

stm32 如何生成.bin文件-keil fromelf.exe使用

文章目录 一、fromelf.exe简介二、生成.bin文件设置工程&#xff1a;编译工程&#xff1a;配置fromelf.exe&#xff1a;重新编译&#xff1a; 三、fromelf.exe的其他功能四、使用注意事项五、总结 keil fromelf.exe使用 在Keil的开发流程中&#xff0c;fromelf.exe工具扮演了至…

【数据分析】如何构建指标体系?

有哪些指标体系搭建模型&#xff1f;五个步骤教你从0开始搭建指标体系 一、企业指标体系搭建存在什么问题 许多企业在搭建数据指标体系时遇到了诸多难题&#xff0c;如问题定位不准确、数据采集不完整、目标不一致、报表无序、指标覆盖不全面以及报表价值未充分利用等。 1、…

通过 ssh config 快速免密连接服务器

通过 ssh config 快速免密连接服务器 目录 通过 ssh config 快速免密连接服务器1. 创建ssh的私钥和公钥的话 &#xff08;如果已经做过可忽略&#xff09;2. 创建config文件&#xff0c;填写服务器配置3. 允许在远程服务器的授权密钥上安装 SSH 密钥 1. 创建ssh的私钥和公钥的话…

客户关系管理(CRM)是什么?CRM定义最全解读!

有企业就有业务&#xff0c;有业务就有客户&#xff0c;所以客户关系管理&#xff08;CRM&#xff09;系统是企业管理中不可或缺的一部分&#xff0c;它帮助企业有效管理与客户之间的关系&#xff0c;提升客户满意度和忠诚度。本文将重点探讨CRM的概念和不同的定义&#xff0c;…

lc 142 环形链表II

先判断存在环形链表&#xff0c;然后根据 x z&#xff0c;得到入口 /** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val x; * next null; * } * } */ public class Sol…

骑行,每天骑行多少最好?

热爱骑行的人都知道&#xff0c;每一次转动踏板都像是与风的对话&#xff0c;与大地的亲吻。我们校长骑行群的伙伴们&#xff0c;如同追逐自由的飞鸟&#xff0c;在骑行的道路上享受着速度与激情、宁静与思考。然而&#xff0c;一个看似简单却至关重要的问题常常萦绕在我们心头…

智能驾驶系列报告之一:高精度定位,智能驾驶的可靠辅助

城市导航辅助驾驶迅速落地&#xff0c;高精度定位迎来发展契机&#xff1a;首先&#xff0c;以城市 NOA为代表的 L3 级别功能正快速落地&#xff0c;智能驾驶已成各车企竞争的核心领域&#xff0c;搭载城市 NOA 功能的车型数量及渗透率快速提升。伴随电动化和智能化的提升&…

LeetCode136只出现一次的数字I

题目描述&#xff1a;给你一个非空整数数组nums&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 看到这个题第一想法应该是使用map记录数字及数字出现的次数&#xff0c;如果原数组长度为n&#xff0c;则map的记录条…

React 前端使用 Input 输入框的样式上传一个 Excel 文件并读取内容对象数组

本文讲解了关于如何在 React 前端使用 Input 输入框上传一个 Excel 文件&#xff0c;并读取文件内容转成 json 数据格式&#xff08;对象数组&#xff09;。 文章目录 1、Excel 文件展示2、完整代码3、数据结果展示4、前端样式展示5、使用 button 按钮的前端样式 1、Excel 文件…

Kubernetes:(五)Pod 基础概念

文章目录 一、Pod基础概念pod的状态容器&#xff08;Container&#xff09;生命周期pod创建容器的过程&#xff1a; 二、底层容器Pause三、初始化容器&#xff08;initcontainers&#xff09;四、Pod容器的分类五、镜像拉取策略&#xff08;image PullPolicy&#xff09;六、重…

【Vue 全家桶】2、Vue 组件化编程

目录 模块与组件、模块化与组件化 component模块组件 非单文件组件单文件组件 .vue 模块与组件、模块化与组件化 component 模块 组件 局部功能代码和资源的集合 非单文件组件 // 1、创建组件 const school Vue.extend({data(){return {}} }) const student Vue.extend(…

IPC-A-610J-中文版 CHINESE-中文版 2024 电子组件的可接受性

IPC-A-610J-中文版 CHINESE-中文版 2024 电子组件的可接受性.pdf 链接: https://pan.baidu.com/s/1UreAzlB_P7tGH_WoFL2Ybg?pwd1234 提取码: 1234 https://share.weiyun.com/eQCyAPYh 通过网盘分享的文件&#xff1a;IPC-A-610J-中文版 CHINESE-中文版 2024 电子组件的可接受性…

el-input限制只能输入合法的数字

// 校验输入的数字是一个合法有效的数字 export function setValue(e) {return e.replace(/[^0-9.]/g, "") // 移除非法字符 .replace(/^0/, "0").replace(/^0(\d|\.$)/, "0$1") // 只保留一个开头的零&#xff08;如果存在&#xff09;&#x…

智能AI快速生成演示文

文多多AIPPT&#xff1a;智能AI快速生成演示文稿&#xff0c;仅需提供核心主题&#xff0c;1分钟内即可完成PPT创作&#xff01; 通过点击图片或链接进行注册&#xff0c;您将获得9次免费体验文多多AIPPT的机会。https://docmee.cn/?sourceiui 当谈到PPT&#xff0c;很多人的第…