QT多线程编程基础
文章目录
- 前言
- 一、线程,进程 介绍
- 二、创建线程
- 三、终止线程
- 总结
前言
一、线程,进程 介绍
线程:
是操作系统中独立运行的最小单位。每个线程都有自己的执行路径、程序计数器、堆栈和一组寄存器。线程共享进程的资源,如内存和文件描述符,可以并发执行,从而提高程序的并发性和响应性。
进程:
是操作系统中运行的一个程序实例。它拥有独立的内存空间和系统资源,如文件句柄、网络连接等。一个进程可以包含多个线程,这些线程共享进程的资源。进程之间相互独立,拥有各自的地址空间和系统资源,并通过进程间通信(IPC)机制进行交互。
总结起来,线程是进程的一部分,是可以并发执行的辅助单位,共享进程的资源。进程是独立运行的程序实例,拥有独立的资源和内存空间。线程通常用于并发执行任务,而进程通常用于隔离不同的应用程序和提供资源独立性。

二、创建线程
在 Qt 中,可以使用 QThread 类来创建线程。
Qt 中的线程以对象的形式被创建和使用。每一个线程对应着一个 QThread 对象。
创建线程的一般步骤如下:
- 定义一个继承自QThread的类。
- 在该类中重写run()方法,并在其中实现线程的任务逻辑。
- 创建该自定义线程类的对象。
- 调用对象的start()方法来启动线程。
-
void run ( )
线程体函数,用于定义线程功能(执行流)
具体而言,它用于启动一个新线程并调用线程的 run() 方法。 -
void start ( )
启动函数,将线程入口地址设置为 run 函数。
调用 start() 后,线程会自动调用 run() 方法执行线程的任务逻辑。 -
void terminate ( )
强制结束线程(不推荐)
示例代码:
#include <QCoreApplication>
#include <QThread>
#include <QDebug>class MyThread : public QThread //创建线程类
{
protected:void run() //线程入口,线程体函数{qDebug() << objectName()<< " : begin";for(int i=0; i < 5 ;i++){qDebug() << objectName()<< " : "<< i;sleep(1); //休眠 1 秒}qDebug() << objectName()<< " : end";}int main(int argc, char *argv[]) //主线程入口函数
{QCoreApplication a(argc, argv);qDebug() << "main : begin";MyThread t; //创建子线程t.setObjectName("t1");t.start(); //启动线程qDebug() << "main : end";return a.exec();
}
输出结果:

注意:
示例中 主线程 将优先于 子线程 结束。
所有线程都结束后,进程结束。
三、终止线程
怎末结束线程呢
在工程开发中,terminate () 是禁止使用的! terminate ()会使操作系统 暴力终止线程,而不会考虑数据的完整性,资源释放等问题!
结束线程 方法:
设置一个标志位当需要终止线程时设置这个 标志位。
在 Mythread 中提供一个标志位变量,并且提供一个stop()函数,当需要将线程终止时将这个 m_stop 设置为true即可。
在线程的run()方法中,定期检查标志位的状态。如果标志位为真,则线程执行完当前任务后自行退出。
#include <QCoreApplication>
#include <QThread>
#include <QDebug>class MyThread : public QThread
{
protected:bool m_to_stop; //终止标志位void run() //线程入口,线程体函数{qDebug() << objectName()<< " : begin";for(int i=0;(!m_to_stop)&&(i<5);i++){qDebug() << objectName()<< " : "<< i;sleep(1); //每打印一次,休眠 1 秒}qDebug() << objectName()<< " : end";}public:MyThread(){m_to_stop = false;}void stop(){m_to_stop = true;}
};int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);qDebug() << "main : begin";MyThread t;t.setObjectName("t1");t.start();for(int i=0;i<5;i++){QThread::sleep(1); //休眠if(i == 2)t.stop(); //休眠 3 秒后终止线程}qDebug() << "main : end";return a.exec();
}
输出结果:

总结
相关文章:
QT多线程编程基础
文章目录 前言一、线程,进程 介绍二、创建线程三、终止线程总结 前言 一、线程,进程 介绍 线程: 是操作系统中独立运行的最小单位。每个线程都有自己的执行路径、程序计数器、堆栈和一组寄存器。线程共享进程的资源,如内存和文件…...
TRT4-trt-integrate - 3 使用onnxruntime进行onnx的模型推理过程
前言: onnx是microsoft开发的一个中间格式,而onnxruntime简称ort是microsoft为onnx开发的推理引擎。允许使用onnx作为输入进行直接推理得到结果。 py接口的推理过程: main函数: if __name__ "__main__":session onn…...
layui+drogon完成文件上传(简例)
layui界面加入按钮、文本框、进度条: <div class"layui-row"><button type"button" class"layui-btn" id"file_upload_control">文件上传</button><input type"file" id"files_input…...
高精度地图服务引擎项目
技术栈:使用vue3TypeScriptElement PlusPiniaaxios 项目描述:高精度地图服务引擎项目,提供轻量化处理3D瓦片切片分布式处理分发服务的一站式解决方案 工作内容:1、项目60%已上的页面开发 2、部分模块的功能实现, 3、封…...
PyTorch使用Transformer进行机器翻译
文章目录 简介数据集环境要求实验代码实验结果参考来源 简介 本文使用PyTorch自带的transformer层进行机器翻译:从德语翻译为英语。从零开始实现Transformer请参阅PyTorch从零开始实现Transformer,以便于获得对Transfomer更深的理解。 数据集 Multi30…...
LoadRunner使用教程
1. LoadRunner简介 LoadRunner是一款广泛使用的性能测试工具 可以对各种应用程序进行性能测试,包括Web应用程序、移动应用程序、企业级应用程序等。它提供了一个综合的性能测试解决方案,包括测试计划设计、脚本录制、测试执行、结果分析和报告生成等功…...
Zia和ChatGPT如何协同工作?
有没有集成ChatGPT的CRM系统推荐?Zoho CRM已经正式与ChatGPT集成。下面我们将从使用场景、使用价值和使用范围等方面切入讲述CRMAI的应用和作用。 Zia和ChatGPT如何协同工作? Zia和ChatGPT是不同的人工智能模型,在CRM中呈现出共生的关系。 …...
【位操作】——获取整数变量最低位为 1 的位置
获取整数变量最低位为 1 的位置 #define BIT_LOW_BIT(y) (((y)&BIT(0)) ? 0 : (((y)&BIT(1)) ? 1 : (((y)&BIT(2)) ? 2 : (((y)&BIT(3)) ? 3 : \(((y)&BIT(4)) ? 4 : (((y)&BIT(5)) ? 5 : (((y)&BIT(6)) ? 6 : (((y)&…...
gtest测试用例注册及自动化调度机制源代码流程分析
gtest的入门参见: 玩转Google开源C单元测试框架Google Test系列(gtest) gtest源码分析流程参见: gtest流程解析 测试用例注册流程分析要点:TEST_F宏替换、C静态成员的动态初始化。 自动化调度流程分析要点:UnitTest、UnitTestIm…...
IOS自动化测试环境搭建教程
目录 一、前言 二、环境依赖 1、环境依赖项 2、环境需求与支持 三、环境配置 1、xcode安装 2、Git安装 3、Homebrew安装(用brew来安装依赖) 4、npm和nodejs安装 5、libimobiledevice安装 6、idevicesinstaller安装 7、ios-deploy安装 8、Ca…...
常用API学习08(Java)
格式化 格式化指的是将数据按照指定的规则转化为指定的形式 。 那么为什么需要格式化?格式化有什么用? 以数字类为例,假设有一个比分牌,在无人得分的时候我们希望以:“00:00”的形式存在,那么…...
面试题-TS(八):什么是装饰器(decorators)?如何在 TypeScript 中使用它们?
面试题-TS(八):什么是装饰器(decorators)?如何在 TypeScript 中使用它们? 在TypeScript中,装饰器(Decorators)是一种用于增强代码功能的特殊类型声明。装饰器提供了一种在类、方法、…...
Jenkins 还可以支持钉钉消息通知?一个插件带你搞定!
Jenkins 作为最流行的开源持续集成平台,其强大的拓展功能一直备受测试人员及开发人员的青睐。大家都知道我们可以在 Jenkins 中安装 Email 插件支持构建之后通过邮件将结果及时通知到相关人员。 但其实 Jenkins 还可以支持钉钉消息通知,其主要通过 Ding…...
7.ES使用
ES多条件查询 and , or这种的 ES模糊查询 like这种的 {"wildcard": {"title.keyword": {"value": "*宣讲*"}}}说明: title是要匹配的关键字段名称keyword是属性,表示匹配的是关键字信息,如果不用.ke…...
Web安全基础
1、HTML基础 什么是 HTML HTML 是用来描述网页的一种语言。 HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言,而是一种标记语言 (Markup language) 标记语言是一套标记标签 (Markup tag) HTML 使用标记标签来描述网页 总的来说&…...
jQueryAPI
文章目录 1.jQuery 选择器1.1 jQuery 基础选择器1.2 jQuery 层级选择器1.3 隐式迭代1.4 jQuery 筛选选择器1.5 jQuery 筛选方法1.6 jQuery 里面的排他思想1.7 链式编程 2.jQuery 样式操作2.1 操作 css 方法2.2 设置类样式方法2.3 类操作与className区别 3.jQuery 效果3.1 显示隐…...
如何将路径字符串数组(string[])转成树结构(treeNode[])?
原文链接:如何将路径字符串数组(string[])转成树结构(treeNode[])? 需求 这里的UI使用的是Element-Plus。 将一个路径字符串数组(当然也可能是其他目标字符串数组),渲染成树。 /*source:/a/b/c/d/e/a/b/e/f/g/a/b/h/a…...
中国工程院院士陈晓红一行莅临麒麟信安调研
7月20日下午,中国工程院院士、湘江实验室主任、湖南工商大学党委书记陈晓红,湘江实验室副主任、湖南工商大学副校长刘国权,湘江实验室副主任、湖南工商大学党委组织部统战部常务副部长胡春华等领导一行莅临麒麟信安调研。麒麟信安董事长杨涛&…...
解决Linux环境下启动idea服务,由于权限问题无法正常启动问题
问题: 在Linux环境下启动idea服务,一直提示: invalid registry store file /app/appuser/.dmf/dubbo,cause:failed to create directory /app/appuser! 原因:文件夹中没有操作权限。 解决: (1࿰…...
Linux6.16 Docker consul的容器服务更新与发现
文章目录 计算机系统5G云计算第四章 LINUX Docker consul的容器服务更新与发现一、consul 概述1.什么是服务注册与发现2.什么是consul 二、consul 部署1.consul服务器2.registrator服务器3.consul-template4.consul 多节点 计算机系统 5G云计算 第四章 LINUX Docker consul的…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
