项目班——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将对象转移到另一个线程中,然后执行

相关推荐
惊起白鸽4501 小时前
MySQL全量,增量备份与恢复
数据库·mysql
暮雨疏桐2 小时前
MySQL SQL Mode及其说明
数据库·sql·mysql·sql mode
Tangcan-2 小时前
【MySQL】数据库基础
数据库·mysql
π大星星️3 小时前
HAProxy + Keepalived + Nginx 高可用负载均衡系统
运维·nginx·负载均衡
蔡蓝3 小时前
Mysql的索引,慢查询和数据库表的设计以及乐观锁和悲观锁
数据库·mysql
jstart千语3 小时前
【Redis】分布式锁的实现
数据库·redis·分布式
菜菜why3 小时前
AutoDL租用服务器教程
服务器
IT专业服务商3 小时前
联想 SR550 服务器,配置 RAID 5教程!
运维·服务器·windows·microsoft·硬件架构
一把年纪学编程4 小时前
【牛马技巧】word统计每一段的字数接近“字数统计”
前端·数据库·word
极小狐4 小时前
极狐GitLab 通用软件包存储库功能介绍
java·数据库·c#·gitlab·maven