项目班——0408——qt的多线程开发

目录

一、并发、并行的概念

[1. 并发](#1. 并发)

例子

[2. 并行](#2. 并行)

二、qt的多线程开发

三、Qt多线程开发方法

[1、可以使用QTthread 创建线程 来执行线程函数](#1、可以使用QTthread 创建线程 来执行线程函数)

2、可以借助moveToThread将对象转移到另一个线程中,然后执行


一、并发、并行的概念

1. 并发

多个任务在同一时间段内交替执行(可能共享同一资源),但不一定同时发生。

核心思想:通过快速切换任务(例如时间片轮转)模拟"同时进行"的效果。

适用场景:单核 CPU 处理多个线程。 I/O 密集型任务(例如同时处理多个网络请求)。

例子

一个人边吃饭边回消息:两种行为交替进行,但同一时刻只做一件事。单核 CPU 通过线程切换运行多个程序。

2. 并行

多个任务真正同时执行,通常依赖多核 CPU 或多台机器。

核心思想:利用物理上的多处理器资源,实现任务的实际并行。

适用场景:多核 CPU 同时运行多个线程。计算密集型任务(例如大规模矩阵运算)。

例子:多个人同时完成不同的工作:每个人独立执行任务。GPU 并行处理图像渲染的多个像素计算。

二、qt的多线程开发

多线程开发:可以近似于同时做事

1、单线程测试例子

2、问题:程序未响应:

3、主函数内的exec函数概念

exec调用会开启主事件的循环(主线程)

while(1)

{

接受信号------>执行槽函数

接受事件------>执行事件响应

exit(num); //num是程序的返回值

}

可能在接受某个信号时被阻塞住了,不能接受其他事件了,比如刚打开项目就无响应,可能是连接服务器时ip地址写错了,或者连不上服务器

4、改为使用多线程

返回值是一个句柄 _CRTIMP uintptr_t __cdecl _beginthreadex(

void *_Security, //安全级别 可以为空

unsigned _StackSize, //默认栈大小 可以为空

unsigned (__stdcall *_StartAddress) (void *), //函数指针 类外的普通函数

void *_ArgList, //参数列表

unsigned _InitFlag, //挂起还是直接执行

unsigned *_ThrdAddr); //获取id,通过这个获取

改为:

  1. qt信号槽 使用的时候需要注意什么

connect参数:发送对象地址,发送的信号,接收者对象地址,处理槽函数地址,

connect函数的第五个参数:

如果connect函数写了两遍,会导致槽函数执行两遍,如果加上第五个参数,就可以保证只执行一遍

发送信号的对象:必须是Q_OBJECT的子类,类的定义中,必须包含Q_OBJECT宏

  1. 在自己创建的线程里处理主线程内的空间

给ui创建一个getUi方法

pb_test是在主线程内创建的,在自己定义的线程内将其隐藏,会触发隐藏事件,事件循环会出错

因此这里应该发信号,让主线程内的槽函数执行,而不是直接调用界面,更新界面

因此可以使用Qt内的方式开发,这样会更简洁和方便

三、Qt多线程开发方法

1、可以使用QTthread 创建线程 来执行线程函数

QThread的使用:

1\]头文件 \[2\]重写这个类:为了可以使用信号槽函数机制,需要加宏 ![](https://i-blog.csdnimg.cn/direct/0ba8251a7e3f43e887304cc0bbdc992a.png) \[3\]线程函数void run(); 看似没有参数,不过可以通过给属性赋值完成传参 run()函数: 1.是线程函数执行的入口,通过start开启执行这个run函数 2.当线程对象创建时,线程就已经存在了,只是不知道什么时候开始执行 3.直到start时,线程开始执行 4.如果run()没有返回还在执行,调用start什么也不做 \[4\]线程函数的执行,需要调用start()函数执行 ![](https://i-blog.csdnimg.cn/direct/fe38d4a8722f4902b8161a57ec07b735.png) 定义对象: ![](https://i-blog.csdnimg.cn/direct/8153b6045b5145b1844ad6c8d81843f5.png) 添加声明: ![](https://i-blog.csdnimg.cn/direct/512a95f5536143799bfab8cd670c75c4.png) 输出线程id: ![](https://i-blog.csdnimg.cn/direct/d9e94c28677b438ba0be6c71e02ce5ec.png) 总结:![](https://i-blog.csdnimg.cn/direct/a5b527a1fc1041488bfa7289e768a514.png) ### 2、可以借助moveToThread将对象转移到另一个线程中,然后执行

相关推荐
skywalk816325 分钟前
在FreeBSD 14.3上部署轻量级Linux jail环境 仅仅占用10M内存
linux·运维·服务器·虚拟机·轻量化·freebsd·jail
敏姐的后花园2 小时前
模考倒计时网页版
java·服务器·前端
小满、2 小时前
MySQL :实用函数、约束、多表查询与事务隔离
数据库·mysql·事务·数据库函数·多表查询
百***35333 小时前
PostgreSQL_安装部署
数据库·postgresql
rayylee5 小时前
生活抱怨与解决方案app
数据库·生活
猫小呆5 小时前
Weaviate服务器部署笔记
服务器·weaviate
M158227690555 小时前
工业互联利器!EtherNet/IP 转 ModbusTCP 网关,让跨协议通信零门槛
服务器·网络·tcp/ip
阿巴~阿巴~5 小时前
基于UDP协议的英汉翻译服务系统:从网络通信到字典查询的完整机制
linux·服务器·网络·网络协议·udp协议·套接字绑定·英汉翻译服务系统
阿巴~阿巴~5 小时前
简易回声服务器实现与网络测试指南
linux·服务器·网络·udp协议·网络测试·udp套接字编程
Lucifer三思而后行6 小时前
使用 BR 备份 TiDB 到 AWS S3 存储
数据库·tidb·aws