Qt中的多线程

视频链接:https://www.bilibili.com/video/BV1iN411f7dY/?p=2&spm_id_from=pageDriver&vd_source=fa4ef8f26ae084f9b5f70a5f87e9e41b
在Qt中使用多线程可以提高用户体验,若只有一个线程进行处理,则会导致窗口卡顿,这是我们不想看到的
在Qt中使用多线程需要注意
1. 默认的线程在Qt中也称为窗口线程,也叫主线程,负责窗口事件的处理或者窗口控件数据的更新
2. 子线程负责处理后台业务逻辑,子线程中不能对窗口对象进行任何操作,这些事情要交给窗口线程处理
3. 主线程和子线程如果要进行信号的传递,需要使用信号槽机制

常用的API函数

优先级更正,最高为TimeCriticalPriority,最后一个优先级指子线程的优先级跟随主线程的优先级
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

使用多线程步骤

在这里插入图片描述
在这里插入图片描述

第二种方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在第二种使用多线程方法中
任务对象不需要指定父对象并且一个任务类可以有多个任务函数或者将不同任务对象移动到同一个线程中(任务按照线性执行),建议使用第二种,降低耦合,便于维护

错误示范
当前情况下不再是多线程,而是主线程执行这两个working函数
在这里插入图片描述

线程资源的释放

  1. 在创建线程对象的时候为其指定父对象,这样利用Qt线程树机制,线程资源会被自动释放
    在这里插入图片描述
  2. 接收到整个窗口被析构时的信号,释放线程资源

Qt中的线程池

在Qt中,封装了线程池类,这样我们就不需要手写线程池了,它为我们提供了许多方法,我们只需要掌握其中的几个即可
在这里插入图片描述
在这里插入图片描述
举个例子
多继承保证既能使用信号槽机制,又能被封装成runnable类,只需要重写run方法即可
在这里插入图片描述
在这里插入图片描述

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt实现多线程数据收发的方法如下: 首先,在头文件"datareceiver.h"定义了一个名为DataReceiver的类,继承自QThread类。该类包含了一个静态的数据池DataPool,用于存储接收到的数据。同时,该类还定义了一个单例模式的getInstance()函数,用于获取DataReceiver的实例。在构造函数,可以传入一个QObject类型的父对象。还有一个stop()函数,用于停止线程的执行。在run()函数,通过循环判断数据池是否为空,如果不为空,则取出第一个数据并发出信号oneDataReady()。 在源文件"datareceiver.cpp",首先定义了一个静态的QStringList类型的数据池list,并初始化为空列表。然后使用Q_GLOBAL_STATIC宏定义了一个名为s_DataReceiver的全局静态变量,类型为DataReceiver,用于保存DataReceiver的实例。在getInstance()函数,返回s_DataReceiver的值。在构造函数,将父对象传递给QThread的构造函数。stop()函数,调用requestInterruption()函数请求线程断。在run()函数,通过互斥锁mutex保证线程安全,判断数据池是否为空,如果不为空,则取出第一个数据并发出信号oneDataReady()。最后,通过调用msleep()函数短暂睡眠,让出线程。 使用该类的方法是,首先获取DataReceiver的实例,然后调用start()函数启动线程。在接收到数据后,将数据添加到数据池。可以通过连接信号oneDataReady()来处理接收到的数据。 以上是在Qt实现多线程数据收发的简要介绍。\[1\]\[3\] #### 引用[.reference_title] - *1* *3* [一种基于Qt多线程的数据接收方案](https://blog.csdn.net/iriczhao/article/details/121503545)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Qt工作笔记-UDP多线程数据处理及发送(简单实例)](https://blog.csdn.net/weixin_39786534/article/details/111545637)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值