掌握Qt的QThread:深入多线程编程

news2024/9/22 1:04:38

在这里插入图片描述

😎 作者介绍:欢迎来到我的主页👈,我是程序员行者孙,一个热爱分享技术的制能工人计算机本硕,人工制能研究生。公众号:AI Sun(领取大厂面经等资料),欢迎加我的微信交流:sssun902
🎈 本文专栏:本文收录于《深入解析QT》系列专栏,相信一份耕耘一份收获,我会分享QT相关学习内容,不说废话,祝大家都offer拿到手软
🤓 欢迎大家关注其他专栏,我将分享Web前后端开发、人工智能、机器学习、深度学习从0到1系列文章。
🖥随时欢迎您跟我沟通,一起交流,一起成长、进步!

掌握Qt的QThread:深入多线程编程

引言

在现代软件开发中,多线程编程已成为提升应用性能和响应性的关键技术。Qt 提供了一套完整的多线程解决方案,其中 QThread 是核心组件之一。本文将详细介绍如何在 Qt 应用程序中使用 QThread 来实现多线程处理。
Qt的线程实现主要两种方式:子类化QThread和对象moveToThread。

子类化QThread

实现方法

  1. 继承QThread:创建一个新类,继承自QThread
  2. 重写run():在新类中重写run()方法,实现线程执行的逻辑。
  3. 启动线程:在其他线程中使用start()函数来启动此线程。

缺点

  • 对象创建限制:线程中的对象必须在run()函数中创建。
  • 信号接收限制:线程无法接收信号,只能发送信号。

对象moveToThread

实现方式

  1. 新建Worker类:在Worker类的槽函数中实现业务逻辑。
  2. 创建QThread对象:实例化一个QThread对象。
  3. 移动对象到线程:将Worker的实例使用moveToThread()移动到新线程。
  4. 连接信号和槽:确保相关信号和槽正确连接。
  5. 触发执行:在其他线程发射信号,Worker的槽函数将在目标线程中执行。

优缺点

  • 优点:提供了一种灵活简洁的方式来克服子类化QThread的缺点,允许在线程中执行复杂的业务逻辑。
  • 缺点:不适合实现需要在线程中常驻执行的任务(如死循环任务)。

适用场景

  • 轻量级函数:适用于需要在线程中执行多个小函数的情况。
  • 代码重构:在最初未考虑多线程,但后续需要将部分代码迁移到线程中的场景。

细节注意点

  • 槽函数执行:只有槽函数会在新线程中执行。
  • 父对象问题:在创建Worker类实例时,不要指定父对象,否则moveToThread()会失败。

多线程基础

线程(Thread)

线程是程序执行的独立流,它允许多个任务同时进行。每个线程可以看作是程序中的一个执行单元,拥有自己的栈空间和寄存器,但与其他线程共享程序的内存空间。这意味着多个线程可以同时访问相同的数据和资源。

线程的生命周期

  • 创建:当线程对象被实例化时,它处于创建状态。
  • 就绪:线程准备好执行,等待CPU时间。
  • 运行:线程正在执行其任务。
  • 阻塞:线程等待某个事件(如I/O操作)完成。
  • 死亡:线程完成执行或被显式终止。

线程安全(Thread Safety)

线程安全是指在多线程环境中,程序的行为符合预期,且数据的完整性和一致性得到保证。为了实现线程安全,需要确保:

  • 原子操作:确保操作不可被中断,要么完全执行,要么完全不执行。
  • 互斥访问:在任何时刻,只有一个线程可以访问特定的数据或资源。
  • 条件同步:使用条件变量和信号量来控制线程间的协调。
    在这里插入图片描述

同步(Synchronization)

同步是多线程编程中用于控制线程间交互的机制,以防止多个线程同时访问共享资源,从而避免数据竞争和一致性问题。

常见的同步机制包括:

  • 互斥锁(Mutex):一种锁机制,确保一次只有一个线程可以访问特定的代码段。
  • 信号量(Semaphore):一种计数器,用来控制对共享资源的访问数量。
  • 读写锁(Read-Write Lock):允许多个线程同时读取数据,但写入时需要独占访问。
  • 条件变量(Condition Variable):一种同步对象,使线程能够在某些条件不满足时挂起,并在条件满足时被唤醒。

死锁(Deadlock)

死锁是多线程编程中常见的问题,发生在两个或多个线程相互等待对方释放资源,但没有一个线程能够继续执行的情况。避免死锁的策略包括:

  • 锁定顺序:总是以相同的顺序获取多个锁。
  • 超时:尝试获取锁时使用超时机制。
  • 死锁检测:定期检查潜在的死锁情况。

线程局部存储(Thread Local Storage)

线程局部存储是指每个线程独有的数据存储区域,其他线程无法访问。这可以通过QThreadLocal在Qt中实现,用于存储线程特定的数据,如用户信息、会话ID等。

QThread 简介

QThread 是 Qt 中用于执行线程的类。它允许你将耗时的任务移到后台线程执行,从而不会阻塞用户界面。

创建和启动线程

QThread *thread = new QThread();
MyClass *myObject = new MyClass(); // 假设 MyClass 有 run 方法
myObject->moveToThread(thread);

connect(thread, &QThread::started, myObject, &MyClass::run);
connect(this, &MyClass::finished, thread, &QThread::quit);
connect(thread, &QThread::finished, myObject, &QObject::deleteLater);
connect(thread, &QThread::finished, thread, &QThread::deleteLater);

thread->start();

定义线程执行的任务

你需要确保你的任务类继承自 QObject 并重写 run 方法:

class MyClass : public QObject {
    Q_OBJECT

public:
    void run() {
        // 执行耗时任务
    }
};

线程的生命周期管理

使用 moveToThread 方法将对象移动到新线程,并通过信号和槽管理线程的生命周期。

  • QThread::start() 启动线程。
  • QThread::quit() 请求线程安全退出。
  • QThread::finished() 线程完成任务后自动退出。

线程间的通信

使用信号和槽实现线程间的通信:

connect(myObject, &MyClass::resultReady, this, &MainWindow::handleResult);

线程同步

使用互斥锁(QMutex)和读写锁(QReadWriteLock)来同步线程对共享资源的访问。

QMutex mutex;
mutex.lock();
// 访问共享资源
mutex.unlock();

等待线程完成

使用 QThread::wait() 使主线程等待工作线程完成:

thread->wait();

祝大家学习顺利~
如有任何错误,恳请批评指正~~
以上是我通过各种方式得出的经验和方法,欢迎大家评论区留言讨论呀,如果文章对你们产生了帮助,也欢迎点赞收藏,我会继续努力分享更多干货~


🎈关注我的公众号AI Sun可以获取Chatgpt最新发展报告以及腾讯字节等众多大厂面经
😎也欢迎大家和我交流,相互学习,提升技术,风里雨里,我在等你~


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

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

相关文章

产品推荐| 立錡低耗电器件:线性稳压器、Buck 和 Boost 转换器

想让电池用得更久、利用好它的每一份电力?低静态电流的电源转换器是你的必然选择。立錡深谙电源管理之道,为你备好了低耗电的各种产品,其中包括低压差线性稳压器、Buck 转换器和 Boost 转换器,最低消耗仅有 360nA,是无…

前端面试题35(在iOS和Android平台上,实现WebSocket协议有哪些常见的库或框架?)

在iOS和Android平台上,实现WebSocket协议有许多成熟且被广泛使用的库和框架。下面是一些推荐的选项: iOS 平台 SocketRocket 简介:这是由Facebook开源的库,专门为iOS和Mac OS X设计,提供WebSocket连接的功能。它基于S…

Doris数据库---建表、调整表结构操作

一、简介 本文章主讲创建 Doris 自维护的表的语法,以下为本人最近为数据中台接入doris所踩的坑及其解决方案,欢迎点评。 二、doris建表语法: 官网建表语法网址链接:CREATE-TABLE - Apache Doris 官网建表语法如图所示&#xf…

如何查找指定的node版本

1.打开网站 “Node.js — Run JavaScript EverywhereNode.js is a JavaScript runtime built on Chromes V8 JavaScript engine.https://nodejs.org/2. 3. 4.

运动爱好者的新选择:哈氪聆光气传导耳机,轻巧又安全

平时不管是漫步街头、骑行穿梭,还是乘坐公共交通时,我总是喜欢佩戴耳机,借此隔绝外部的喧嚣,享受音乐的乐趣。在户外使用耳机,我更倾向于选择气传导耳机,它们更符合我的需求,因为这种耳机能让我…

Hi3861鸿蒙开发环境搭建

1.1 安装配置Visual Studio Code 打开Download Visual Studio Code - Mac, Linux, Windows选择下载安装Windows系统的Visual Studio Code。 下载后进行安装。Visual Studio Code安装完成后,通过内置的插件市场搜索并安装开发所需的插件如图所示: 1.2 安…

OpenCV对图片中的水果进行识别计算其面积长度等

本项目所用到的技术有: OpenCV Python的一些库:sys,openpyxl,numpy,PyQt5,PIL 本文可以做一些课程设计的项目 本文为作者原创,转载请注明出处,如果需要完整的代码,可以关注我私信 上面是用到的样例图片,一张…

万字总结GBDT原理、核心参数以及调优思路

万字总结GBDT原理、核心参数以及调优思路 在机器学习领域,梯度提升决策树(Gradient Boosting Decision Tree, GBDT)以其卓越的预测性能和强大的模型解释能力而广受推崇。GBDT通过迭代地构建决策树,每一步都在前一步的残差上进行优…

39 线程库

目录 thread类的简单介绍线程函数参数锁线程交替打印原子性操作库无锁CAS智能指针的线程安全单例模式的线程安全 1. thread类的简单介绍 在c11之前,涉及到多线程问题,都是和平台相关的,如windows和linux下各有自己的接口,这使得…

基于SpringBoot的网上书城管理系统

你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:Java 数据库:MySQL 技术:Java技术,基于SpringBoot框架 工具:Eclipse,MySQL 系统展示 首…

数图助推朝阳佳惠辽宁华联开启数字化导航、精细化管理新纪元!

近期,辽宁省著名零售企业朝阳佳惠与辽宁华联,秉持创新精神,大胆尝试,在品类空间管理方面推出了创新举措。引入了先进的数图可视化陈列管理系统,通过智能化、直观化的方式优化商品布局。此举不仅大幅提高了商品管理的效…

探索Qt的QVariant:灵活的数据交换机制

😎 作者介绍:欢迎来到我的主页👈,我是程序员行者孙,一个热爱分享技术的制能工人。计算机本硕,人工制能研究生。公众号:AI Sun(领取大厂面经等资料),欢迎加我的…

windows的远程桌面连接docker

1. Docker容器中运行远程桌面服务 (RDP):您的Docker容器需要安装和运行远程桌面服务。通常,远程桌面服务在Windows操作系统上可用。如果您使用的是Linux容器,则需要安装一个支持RDP协议的桌面环境和RDP服务器。 2. 开放RDP端口:通…

【正点原子i.MX93开发板试用连载体验】项目计划和开箱体验

本文最早发表于电子发烧友:【   】【正点原子i.MX93开发板试用连载体验】基于深度学习的语音本地控制 - 正点原子学习小组 - 电子技术论坛 - 广受欢迎的专业电子论坛! (elecfans.com)https://bbs.elecfans.com/jishu_2438354_1_1.html 有一段时间没有参加电子发…

Java泛型的定义与运用

泛型 泛型的作用从使用层面上来说是统一数据类型,防止将来的数据转换异常。从定义层面上来说,定义带泛型的类,方法等,将来使用的时候给泛型确定什么类型,泛型就会变成什么类型,凡是涉及到泛型的都会变成确…

飞时达土方计算软件:工程师的得力助手

初识飞时达 飞时达土方计算软件,如同一位默默无闻的工匠,静静地伫立在我的工作台上。它没有华丽的外表,也没有炫目的光环,但它的存在,却如同一盏明灯,照亮了我前行的道路。 初识飞时达,是在一…

Word文件打开密码设置:掌握这两种方法,保护你的文档安全

在日常工作和学习中,我们经常会使用Microsoft Word来创建和编辑文档。有时候,为了保护文档内容不被未经授权的人员查看或修改,我们通常会采用加密的方式来增加其安全性。那么Word文档怎么加密? 方法一:使用Word软件内置…

GTK是如何加密WLAN组播和广播数据的?

1. References WLAN 4-Way Handshake如何生成GTK?_tk bigtk gtk igtk-CSDN博客 2. 概述 在Wi-Fi网络中,单播、组播和广播帧的加密算法是由AP决定的。其中组播帧和广播帧的加密使用GTK密钥,其PTK的密钥结构如下图所示: GTK的组成…

【技术选型】FastDFS、OSS如何选择

【技术选型】FastDFS、OSS如何选择 开篇词:干货篇:FastDFS:OSS(如阿里云OSS): 总结篇:我是杰叔叔,一名沪漂的码农,下期再会! 开篇词: 文件存储该选…

YOLOv8改进 | 注意力机制 | 对密集和小目标友好的EVAblock 【原理 + 完整代码】

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录 :《YOLOv8改进有效…