【Qt】QThread总结

目录

    • 成员函数
    • 创建方式
      • 方式一
      • 方式二
      • 方式三
      • 注意
    • example
    • 总结
    • 参考文章

成员函数

创建方式

方式一

QThread 静态成员create

auto thd = QThread::create([]{});

方式二

继承QThread类,重写run

  1. run函数它作为线程的入口,也就是线程从run()开始执行,我们打算在线程中完成的工作都要写在run()函数中,个人认为可以把run()函数理解为线程函数。这也就是子类覆写基类的虚函数,基类QThread的run()函数只是简单启动exec()消息循环。
  2. Qthread中其他函数均不是在子线程中执行

方式三

movemoveToThread使用信号与槽方式来实现多线程

class Work : public QObject
{
public slots:void doWorking(){for (size_t i = 0; i < 10; i++){std::cout << i << ", thd ID=" << QThread::currentThread() << std::endl;}std::cout << "-----------------------------" << std::endl;}void doOtherWorking(){for (size_t i = 0; i < 10; i++){std::cout << i << ", thd ID=" << QThread::currentThread() << std::endl;}std::cout << "doOtherWorking -----------------------------" << std::endl;}
};auto pThd = new QThread;
Work work;
work.moveToThread(pThd);
QObject::connect(&startButton, &QPushButton::clicked, [&]{ pThd->start(); });QObject::connect(&thdButton, &QPushButton::clicked, &work, &Work::doWorking);
QObject::connect(&thdButton, &QPushButton::clicked, &work, &Work::doOtherWorking);std::cout << QThread::currentThread() << std::endl;

注意

  1. Work实例化时不可以指定父对象
  2. 当一个变量需要在多个线程间进行访问时,最好加上voliate关键字,以免读取到的是旧的值。当然,Qt中提供了线程同步的支持,比如互斥锁之类的玩意,使用这些方式来访问变量会更加安全
  3. 一定要用信号槽机制,别想着直接调用,你会发现并没有在子线程中执行

example

  1. 非阻塞式线程运行
QEventLoop loop;
QtConcurrent::run([&]()
{doSomething();loop.quit();
});
loop.exec();

上述写法存在两个问题

  1. QtConcurrent::run()执行后线程立即开始执行,当doSomething()很快时,loop.quit()的执行时间可能早于loop.exec(),这样事件循环就再也不会退出了
  2. 当doSomething因为某些原因crash时,如果没有导致程序崩溃,loop.quit无法被执行,事件循环同样无法退出

下面给出优化后的代码

QEventLoop loop;
QThread* pThread = QThread::create([&]()
{doSomething();
});
connect(pThread, &QThread::finished, &loop, &QEventLoop::quit);
pThread->start(); // 线程开始执行
loop.exec();

总结

  1. 第一种方法适合创建临时任务,用到了lambda表达式
  2. 第二种方法适合在线程中处理单一事件,其逻辑简单(只需要新建一个继承自QThread类的对象,重写run函数,然后启动即可)
  3. 第二种方法,我们可以自定义带参的子线程运行函数,代码简洁;随意修改需要在哪个线程中运行,代码灵活

参考文章

QT从入门到入土(五(1))——多线程(QThread) - 唯有自己强大 - 博客园

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/66890.shtml

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

相关文章

CVE-2025-22777 (CVSS 9.8):WordPress | GiveWP 插件的严重漏洞

漏洞描述 GiveWP 插件中发现了一个严重漏洞&#xff0c;该插件是 WordPress 最广泛使用的在线捐赠和筹款工具之一。该漏洞的编号为 CVE-2025-22777&#xff0c;CVSS 评分为 9.8&#xff0c;表明其严重性。 GiveWP 插件拥有超过 100,000 个活跃安装&#xff0c;为全球无数捐赠平…

计算机类-C语言课程/书籍推荐

课程&#xff1a; 1.【零基础入门C / C语言-王桂林老师】 https://www.bilibili.com/video/BV1pv411e7v7/?share_sourcecopy_web&vd_source48ead52c9fed3570e765fd86b2873086 理论实操都很到位 2.【C语言进阶】 https://www.bilibili.com/video/BV13J411M7ph/?share_s…

【Linux】网络层

目录 IP协议 协议头格式 网段划分 2中网段划分的方式 为什么要进行网段划分 特殊的IP地址 IP地址的数量限制 私有IP地址和公有IP地址 路由 IP协议 在通信时&#xff0c;主机B要把数据要给主机C&#xff0c;一定要经过一条路径选择&#xff0c;为什么经过路由器G后&…

HarmonyOS:@LocalBuilder装饰器: 维持组件父子关系

一、前言 当开发者使用Builder做引用数据传递时&#xff0c;会考虑组件的父子关系&#xff0c;使用了bind(this)之后&#xff0c;组件的父子关系和状态管理的父子关系并不一致。为了解决组件的父子关系和状态管理的父子关系保持一致的问题&#xff0c;引入LocalBuilder装饰器。…

Elasticsearch—索引库操作(增删查改)

Elasticsearch中Index就相当于MySQL中的数据库表 Mapping映射就类似表的结构。 因此我们想要向Elasticsearch中存储数据,必须先创建Index和Mapping 1. Mapping映射属性 Mapping是对索引库中文档的约束&#xff0c;常见的Mapping属性包括&#xff1a; type&#xff1a;字段数据类…

MySQL进阶突击系列(05)突击MVCC核心原理 | 左右护法ReadView视图和undoLog版本链强强联合

2024小结&#xff1a;在写作分享上&#xff0c;这里特别感谢CSDN社区提供平台&#xff0c;支持大家持续学习分享交流&#xff0c;共同进步。社区诚意满满的干货&#xff0c;让大家收获满满。 对我而言&#xff0c;珍惜每一篇投稿分享&#xff0c;每一篇内容字数大概6000字左右&…

使用 Python 实现自动化办公(邮件、Excel)

目录 一、Python 自动化办公的准备工作 1.1 安装必要的库 1.2 设置邮件服务 二、邮件自动化处理 2.1 发送邮件 示例代码 注意事项 2.2 接收和读取邮件 示例代码 三、Excel 自动化处理 3.1 读取和写入 Excel 文件 示例代码 3.2 数据处理和分析 示例代码 四、综合…

jQuery CSS 类

jQuery CSS 类 引言 在网页设计和开发中&#xff0c;CSS&#xff08;层叠样式表&#xff09;起着至关重要的作用&#xff0c;它负责定义网页的布局、颜色、字体等视觉效果。jQuery&#xff0c;作为一个快速、小巧且功能丰富的JavaScript库&#xff0c;极大地简化了HTML文档的…

rk3568 内核态OOM内存泄漏memleak使用

1&#xff0c;配置&#xff0c;修改\kernel\arch\arm64\configs\rockchip_linux_defconfig&#xff0c;修改后查看.config. larkubuntu:~/Public/rk356x-linux/rk356x-linux/kernel$ cat .config | grep -i kmemleak CONFIG_HAVE_DEBUG_KMEMLEAKy CONFIG_DEBUG_KMEMLEAKy CONFI…

金融项目实战 02|接口测试分析、设计以及实现

目录 ⼀、接口相关理论 二、接口测试 1、待测接口&#xff1a;投资业务 2、接口测试流程 3、设计用例理论 1️⃣设计方法 2️⃣工具 4、测试点提取 5、测试用例&#xff08;只涉及了必测的&#xff09; 1️⃣注册图⽚验证码、注册短信验证码 2️⃣注册 3️⃣登录 …

Kotlin 中 forEach 的 return@forEach 的使用误区

forEach 对于从Java开发转到Kotlin的开发者来说&#xff0c;returnforEach可能具有迷惑性。假如没有仔细了解过这个语法的使用&#xff0c;真的就被它的表象迷惑了。 因为它看上去真的实在太像【跳出forEach循环】了&#xff01;&#xff01;&#xff01; 然而&#xff0c;实际…

指令的修饰符

指令的修饰符 参考文献&#xff1a; Vue的快速上手 Vue指令上 Vue指令下 Vue指令的综合案例 文章目录 指令的修饰符指令修饰符 结语 博客主页: He guolin-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&…

EFCore HasDefaultValueSql

今天小伙伴在代码中遇到了有关 HasDefaultValue 的疑问&#xff0c;这里整理澄清下... 在使用 Entity Framework Core (EFCore) 配置实体时&#xff0c;HasDefaultValue 方法会为数据库列设置一个默认值。该默认值的行为取决于以下条件&#xff1a; 1. 配置 HasDefaultValue 的…

基于 Selenium 实现上海大学校园网自动登录

基于 Selenium 实现上海大学校园网自动登录 一、技术方案 核心工具&#xff1a; Selenium&#xff1a;一个用于自动化测试的工具&#xff0c;能够模拟用户在浏览器上的操作。Edge WebDriver&#xff1a;用于控制 Edge 浏览器的驱动程序。 功能设计&#xff1a; 检测网络状…

[DO374] Ansible 配置文件

[DO374] Ansible 配置文件 1. 配置文件位置2. 配置文件3. Ansible 配置4. Ansible的Ad-hoc5. Ansible 模块6. playbook段落7. 任务执行后续8. Ansible 变量8.1 ansible 变量的定义8.1.1 主机变量8.1.2 主机组变量 8.2 vars的循环 9. Ansible Collection10. Ansible-galaxy 安装…

STM32如何测量运行的时钟频率

前言 环境&#xff1a; 芯片&#xff1a;STM32F103C8T6 Keil&#xff1a;V5.24.2.0 一、简介STM32F103C8T6的时钟源 ①HSI 内部高速时钟,RC振荡器&#xff0c;频率为8MHz&#xff0c;精度不高。②HSE 外部高速时钟,可接石英/陶瓷谐振器&#xff0c;频率范围为4MHz~16MHz&…

【Web安全】SQL 注入攻击技巧详解:UNION 注入(UNION SQL Injection)

【Web安全】SQL 注入攻击技巧详解&#xff1a;UNION 注入&#xff08;UNION SQL Injection&#xff09; 引言 UNION注入是一种利用SQL的UNION操作符进行注入攻击的技术。攻击者通过合并两个或多个SELECT语句的结果集&#xff0c;可以获取数据库中未授权的数据。这种注入技术要…

什么是卷积网络中的平移不变性?平移shft在数据增强中的意义

今天来介绍一下数据增强中的平移shft操作和卷积网络中的平移不变性。 1、什么是平移 Shift 平移是指在数据增强&#xff08;data augmentation&#xff09;过程中&#xff0c;通过对输入图像或目标进行位置偏移&#xff08;平移&#xff09;&#xff0c;让目标在图像中呈现出…

YOLOv10-1.1部分代码阅读笔记-tuner.py

tuner.py ultralytics\utils\tuner.py 目录 tuner.py 1.所需的库和模块 2.def run_ray_tune(model, space: dict None, grace_period: int 10, gpu_per_trial: int None, max_samples: int 10, **train_args): 1.所需的库和模块 # Ultralytics YOLO &#x1f680;, …

大数据智能选课系统

1.产品介绍 产品名称&#xff1a;大数据智能选课系统 一、产品概述 随着信息技术的快速发展&#xff0c;大数据技术在教育领域的应用越来越广泛。针对当前高校选课过程中的繁琐操作、资源分配不均等问题&#xff0c;我们研发了一款基于大数据智能分析的选课系统。本系统旨在…