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

news2024/11/23 18:29:29

一、多线程与线程池的应用目的[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.coloradmin.cn/o/2231062.html

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

相关文章

基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 这里实现的是256*256双线性插值到512*512的系统模块 局部放大&#xff1a; 将数据导入到matlab&#xff0c;得到插值效果…

Spring1(初始Spring 解耦实现 SpringIOC SpringDI Spring常见面试题)

Spring1 创建项目集成maven创建一个Maven项目实现&#xff1a; 初识SpringSpring简介Spring的发展历史Spring之父体系结构生态系统官方文档解耦实现JDBCSpringBoot整合MyBatis和lombok&#xff0c;开启驼峰映射三层思想 SpringIOC实现 SpringDIset注入全部代码&#xff1a;实现…

纯享受 : 力扣:234 回文链表

BLG牛逼 – 奖励自己一道题 描述&#xff1a; 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为 回文链表 。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例&#xff1a; 何解&#xff1f; 1、所谓 回文 就是正读反读都一样&…

开源项目-投票管理系统

哈喽,大家好,今天主要给大家带来一个开源项目-投票管理系统 投票管理系统主要有首页,发起投票,管理投票,参与投票,查看投票等功能 首页 为用户提供了一键导航到各个功能模块的便捷途径。 新增投票 用户可以在此轻松创建新的投票活动,设置投票主题、选项等信息。 管理…

系统架构图设计(行业领域架构)

物联网 感知层&#xff1a;主要功能是感知和收集信息。感知层通过各种传感器、RFID标签等设备来识别物体、采集信息&#xff0c;并对这些信息进行初步处理。这一层的作用是实现对物理世界的感知和初步处理&#xff0c;为上层提供数据基础网络层&#xff1a;网络层负责处理和传输…

APP获取用户的三大法则

APP内容&#xff0c;提升APP吸引力和用户留存率 A. 用户研究深化 1. **深入用户行为分析**&#xff1a; - 用户使用路径分析 - 用户行为模式识别 - 用户流失点分析 2. **定性研究与定量研究结合**&#xff1a; - 进行深度访谈和焦点小组讨论 - 利用数据分析用…

QT——串口调试助手

目录 1.QSerialPort类包含了很多有关串口的API 2.实现串口的打开 2.1 方法一&#xff1a;通过函数实现 2.2 方法二&#xff1a;在ui界面右下角实现 3. 实现定时发送 3.1类的私有成员中添加定时器QTimer timer并去构造函数中初始化它 3.2帮助文档中有QTimer类相关的说明 …

全自动一键批量创建站群网站插件 | Z-BlogPHP 堆词起站工具

在当今竞争激烈的数字营销世界&#xff0c;如何快速提升网站曝光率和流量&#xff1f;答案就是智能站群系统。 本文将结合实际效果&#xff0c;介绍一款功能强大的站群系统&#xff0c;重点讲述其堆词功能、泛目录管理、一键批量创建、内容转码、自定义标签和GPT内容生成与发布…

计算机毕业设计Spark+大模型知识图谱中药推荐系统 中药数据分析可视化大屏 中药爬虫 机器学习 中药预测系统 中药情感分析 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Linux云计算 |【第五阶段】CLOUD-DAY7

主要内容&#xff1a; 在kubernetes平台上理解掌握各种控制器的用法&#xff1a;掌握kubectl管理命令、掌握POD原理、掌握集群调度的规则、熟悉控制器资源文件&#xff1b; 一、kubectl 常用命令 Kubectl是用于控制Kubernetes集群的命令行工具&#xff1b; - 格式&#xff1…

json-server的使用(根据json数据一键生成接口)

一.使用目的 在前端开发初期&#xff0c;后端 API 可能还未完成&#xff0c;json-server 可以快速创建模拟的 RESTful API&#xff0c;帮助前端开发者进行开发和测试。 二.安装 npm install json-server //局部安装npm i json-server -g //全局安装 三.使用教程 1.准备一…

在VS中安装chatGPT

2、在VSCode中打开插件窗口 3、输入ChatGPT 4、这里有个ChatGPT中文版&#xff0c;就它了 5、安装 6、这时候侧边栏多了一个chatGPT分页图标&#xff0c;点击它 7、打个招呼 8、好像不行 9、看一下细节描述 10、根据要求按下按下快捷键 Ctrl Shift P 11、切换成国内模式 12、…

# linux从入门到精通-从基础学起,逐步提升,探索linux奥秘(十九)--mysql数据库基本操作

linux从入门到精通-从基础学起&#xff0c;逐步提升&#xff0c;探索linux奥秘&#xff08;十九&#xff09;–mysql数据库基本操作 一、MySQL的基本操作&#xff08;1&#xff09;&#xff08;难点&#xff09; 1、名词介绍 以Excel文件举例&#xff1a; 数据库&#xff1a…

冒泡排序,快速排序讲义

冒泡排序 基本原理&#xff1a;对存放原始数据的数组&#xff0c;按从前往后的方向进行多次扫描&#xff0c;每次扫描称为一趟。当发现相邻的两个数据次序和排序要求的大小次序不符合的时候&#xff0c;即将这两个数据进行互换。如果从小到大排序&#xff0c;这时&#xff0c;…

智能语音助手:开启智能交互的新时代

随着人工智能和自然语言处理技术的进步&#xff0c;智能语音助手已经逐渐成为日常生活中的一部分。无论是手机上的虚拟助手、智能音箱&#xff0c;还是车载导航和智能家居控制系统&#xff0c;智能语音助手的应用越来越广泛&#xff0c;为用户提供了高效便捷的交互体验。通过语…

vue data变量之间相互赋值或进行数据联动

摘要&#xff1a; 使用vue时开发会用到data中是数据是相互驱动&#xff0c;经常会想到watch,computed&#xff0c;总结一下&#xff01; 直接赋值&#xff1a; 在 data 函数中定义的变量可以直接在方法中进行赋值。 export default {data() {return {a: 1,b: 2};},methods: {u…

uniapp ,微信小程序,滚动(下滑,上拉)到底部加载下一页内容

前言 小程序的内容基本都是滑动到底部加载下一页&#xff0c;这个一般都没有什么好用的组件来用&#xff0c;我看vant和uniapp的插件里最多只有个分页&#xff0c;没有滚动到底部加载下一页。再次做个记录。 效果预览 下滑到底部若是有下一页&#xff0c;则会自动加载下一页&…

【数据分享】2024年我国省市县三级的休闲娱乐设施数量(免费获取/18类设施/Excel/Shp格式)

KTV、棋牌室、音乐厅等休闲服务设施的配置情况是一个城市公共基础设施完善程度的重要体现&#xff0c;一个城市休闲服务设施种类越丰富&#xff0c;数量越多&#xff0c;通常能表示这个城市的公共服务水平越高&#xff01; 本次我们为大家带来的是我国各省份、各地级市、各区县…

Flarum:简洁而强大的开源论坛软件

Flarum简介 Flarum是一款开源论坛软件&#xff0c;以其简洁、快速和易用性而闻名。它继承了esoTalk和FluxBB的优良传统&#xff0c;旨在提供一个不复杂、不臃肿的论坛体验。Flarum的核心优势在于&#xff1a; 快速、简单&#xff1a; Flarum使用PHP构建&#xff0c;易于部署&…

【CSS in Depth 2 精译_056】8.4 CSS 的新特性——原生嵌套(Nesting)+ 8.5 本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第三部分 现代 CSS 代码组织】 ✔️【第八章 层叠图层及其嵌套】 ✔️ 8.1 用 layer 图层来操控层叠规则&#xff08;上篇&#xff09; 8.1.1 图层的定义&#xff08;上篇&#xff09;8.1.2 图层的…