Qt5.9学习笔记-事件(三) 多线程和事件处理

news2024/11/23 10:09:31

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。
如果觉得本文能帮到您,麻烦点个赞👍呗!

近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支持一下呗。👍⭐️❤️
Qt5.9专栏定期更新Qt的一些项目Demo
项目与比赛专栏定期更新比赛的一些心得面试项目常被问到的知识点。

QT5.9专栏会定期更新有趣的Qt知识

以工程为导向进行Qt5.9的学习,打捞基础。专栏中有Qt5.9学习笔记-仿Everything的的文件搜索的GUI工具,以及相关的基础知识。
在这里插入图片描述

最近在重新梳理一下Qt事件的基础知识,发现了一些有趣的知识点和开发的坑点,做一些笔记。

当涉及到Qt5.9事件时,事件系统是非常重要的一个主题。Qt5.9事件系统是一个强大的工具,它允许开发人员在Qt应用程序中响应和处理各种类型的事件。在本文中,我们将讨论Qt5.9事件系统的基础知识以及如何在应用程序中使用它来处理事件。

4. 多线程和事件处理

多线程和事件处理是Qt框架中非常重要的概念,能够帮助我们更好地实现复杂的功能,并提高应用程序的性能。本文将从理解多线程和事件处理、跨线程事件的发送和处理两个方面进行介绍。

4.1 理解多线程和事件处理

多线程和事件处理是两个独立但密切相关的概念。在单线程应用程序中,所有的代码都是顺序执行的,当应用程序接收到事件时,事件处理函数会在主线程中执行。而在多线程应用程序中,每个线程都有自己的执行上下文和事件队列,当应用程序接收到事件时,事件将被分发到相应的线程中进行处理。

在Qt框架中,我们可以使用QThread类来创建新的线程,并使用QObject类的moveToThread()函数来将对象移动到其他线程中。此外,Qt还提供了一套完整的多线程编程模型,包括信号和槽、事件处理、互斥锁等机制,能够帮助我们更好地实现多线程应用程序。

4.2 跨线程事件的发送和处理

在多线程应用程序中,当我们需要在一个线程中执行某个操作,并将操作结果返回给另一个线程时,就需要使用跨线程事件的发送和处理机制。在Qt框架中,我们可以使用QEvent和QCoreApplication类的postEvent()和sendEvent()函数来实现跨线程事件的发送和处理。

下面是一个简单的例子,演示了如何在一个新线程中执行一个任务,并将任务结果返回给主线程。

#include <QCoreApplication>
#include <QDebug>
#include <QThread>
#include <QTimer>

class Worker : public QObject {
    Q_OBJECT
public:
    Worker() {}

public slots:
    void doWork() {
        qDebug() << "Worker thread id: " << QThread::currentThreadId();
        QThread::sleep(2);
        qDebug() << "Work done!";
        emit workFinished();
    }

signals:
    void workFinished();
};

class Controller : public QObject {
    Q_OBJECT
public:
    Controller() {
        m_worker = new Worker();
        m_workerThread = new QThread();
        m_worker->moveToThread(m_workerThread);
        connect(m_workerThread, &QThread::started, m_worker, &Worker::doWork);
        connect(m_worker, &Worker::workFinished, this, &Controller::onWorkFinished);
        m_workerThread->start();
    }

    ~Controller() {
        m_workerThread->quit();
        m_workerThread->wait();
        delete m_worker;
        delete m_workerThread;
    }

signals:
    void startWork();

public slots:
    void onWorkFinished() {
        qDebug() << "Work finished!";
        QCoreApplication::quit();
    }

private:
    Worker* m_worker;
    QThread* m_workerThread;
};

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);
    Controller controller;
    QTimer::singleShot(0, &controller, &Controller::startWork);
    return a.exec();
}

#include "main.moc"

这段代码演示了在Qt中如何使用多线程来执行一个耗时操作(在这个例子中,是等待2秒),并在操作完成后关闭应用程序。

代码中定义了两个类:Worker和Controller,Worker是一个执行耗时操作的工作线程,Controller是应用程序的控制类,负责创建和管理工作线程,并在工作完成后关闭应用程序。

Worker继承自QObject,包含一个doWork()函数,它在工作线程中执行。doWork()函数会在工作线程中输出线程的ID,等待2秒钟,然后输出"Work done!",并发射workFinished()信号表示工作完成。

Controller同样继承自QObject,并包含一个指向Worker对象的指针和一个指向工作线程的指针。在Controller的构造函数中,它创建了一个Worker对象和一个工作线程对象,并将Worker对象移到工作线程中。然后,Controller连接工作线程的started()信号到Worker对象的doWork()槽函数,以便在工作线程启动时执行耗时操作。Controller还连接了Worker对象的workFinished()信号到自己的onWorkFinished()槽函数,在工作完成后关闭应用程序。

在main()函数中,创建了一个QCoreApplication对象和一个Controller对象。然后,使用QTimer::singleShot()函数延迟0毫秒,发出startWork()信号以启动工作线程。最后,调用a.exec()函数进入Qt事件循环,等待应用程序关闭。

总体来说,这段代码演示了如何使用多线程来处理耗时操作,并在工作完成后关闭应用程序。同时,它也演示了如何在不同的线程中发送信号和槽,并在跨线程调用中避免潜在的问题。

image-20230425214551067

最后,最后
如果觉得有用,麻烦三连👍⭐️❤️支持一下呀,希望这篇文章可以帮到你,你的点赞是我持续更新的动力

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

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

相关文章

OpenCV中的图像处理3.4-3.6(四)平滑化、形态学、图像梯度

目录 3.4 平滑化图像目标二维卷积 ( 图像滤波 )图像模糊(图像平滑)其他资源 3.5 形态学转换目标理论结构化元素 3.6 图像梯度目标理论代码一个重要的问题! 翻译及二次校对&#xff1a;cvtutorials.com 编辑者&#xff1a;廿瓶鲸&#xff08;和鲸社区Siby团队成员&#xff09; …

用 Bitmap 实现亿级海量数据统计

在移动应用的业务场景中&#xff0c;我们需要保存这样的信息&#xff1a;一个 key 关联了一个数据集合。 常见的场景如下&#xff1a; 给一个 userId &#xff0c;判断用户登陆状态&#xff1b; 显示用户某个月的签到次数和首次签到时间&#xff1b; 两亿用户最近 7 天的签到…

【C++:模块3-------数组】

C&#xff1a;模块3-------数组 数组概念&#xff1a;数组特点&#xff1a;数组访问方法&#xff1a; 一维数组&#xff1a;1.1三种定义形式&#xff1a;&#xff08;和C语言中一样&#xff09;1.2一维数组数组名的作用&#xff1a;&#xff08;1&#xff09; 统计数组在内存中…

日常的性能测试工作

日常的性能测试工作 (1)在日常的测试工作时如何进行性能测试 日常的性能测试主要是从业务功能点中抽取具有并发特点的&#xff0c;高风险的、大数据量处理的业务&#xff0c;整理成测试用例&#xff0c;制定相应的指标&#xff0c;然后用工具或者手工进行性能测试并分析&#x…

MySQL HeatWave 被添加了机器学习,甲骨文认真了

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

基于javaweb的学生就业管理系统

一、简介 学生基业管理系统有三个角色&#xff1a;管理员、企业、学生 对学生信息管理、企业信息管理、求职信息管理 后端架构&#xff1a;spring springmvc mybatis 前端架构&#xff1a;jsp layui 系统环境&#xff1a;jdk1.8 | maven | mysql 二、主要功能 1. 登录…

jvm之垃圾回收相关概念解读

目录 System.gc()的理解 内存溢出与内存泄露 内存溢出&#xff08;OOM&#xff09; 内存泄漏&#xff08;Memory Leak&#xff09; Stop The World 垃圾回收的并行与并发 程序中的并发&#xff08;Concurrent&#xff09; 程序中的并发&#xff08;Parallel&#xff09…

揭秘镭速传输点对点传输技术,NAT+Raysync强强组合

点对点传输是一种文件即时传输方式用于实现数据的快速联动&#xff0c;为所有客户端提供资源&#xff0c;包括带宽、存储空间、计算能力。点对点传输技术有很多应用&#xff0c;包括共享各种格式音频、视频、数据等。 在5G重新定义带宽&#xff0c;信息技术不断发展的今天&…

Python:概念解析:基础语法

Python基础语法 1. 列表&#xff0c;元组&#xff0c;字典1.1 列表1.2. tuple元组1.3 字典dict 2. 数据类型推断2.1 在Python中有一个函数 isinstance(data,type) , 可以用来判断某个数据是什么类型。 3. Python 基本数据类型3.1 整型 int 本章节介绍Python的一些基础语法 1. 列…

《可穿戴式血压测量设备与高血压管理的新方法:数字时代》阅读笔记

目录 一、论文摘要 二、论文十问 Q1&#xff1a;论文试图解决什么问题&#xff1f; Q2&#xff1a;这是否是一个新的问题&#xff1f; Q3&#xff1a;这篇文章要验证一个什么科学假设&#xff1f; Q4&#xff1a;有哪些相关研究&#xff1f;如何归类&#xff1f;谁是这一课…

PySide6/PyQT多线程之 线程安全:互斥锁条件变量的最佳实践

前言 在PySide6/PyQT中使用多线程时&#xff0c;线程锁和线程安全是非常重要的概念。本文将介绍线程锁和线程安全的基本概念&#xff0c;以及如何在PySide6/PyQT中使用它们。 使用PySide6/PyQT开发GUI应用程序&#xff0c;在多个线程同时访问同一个共享对象时候&#xff0c;如果…

单词词义、词性、例句查询python代码

单词发音、词义、词性、例句查询、输出结果更简洁&#xff0c;一次可查多个单词 运行该代码&#xff0c;命令窗口输入单词&#xff0c;单词用“/”分开&#xff0c;例如&#xff1a;noisy/problem/community/neighbor 可以更多。先安装两个python包requests、 beautifulsoup4&…

Eureka详解

Eureka概述和架构 Eureka Spring Cloud Eureka 是Netflix 开发的注册发现组件&#xff0c;本身是一个基于 REST 的服务。提供注册与发现&#xff0c;同时还提供了负载均衡、故障转移等能力 Eureka3个角色 服务中心&#xff0c;服务提供者&#xff0c;服务消费者 Eureka Se…

Win11的两个实用技巧系列之蓝屏死循环解决办法、调高进程的优先级方法

Win11蓝屏死循环怎么办?Win11蓝屏死循环解决办法 有用户安装Win11系统的时候&#xff0c;重新启动电脑的时候&#xff0c;会一直进入蓝屏的错误循环中&#xff0c;本文就为大家带来详细的解决方法&#xff0c;需要的朋友一起看看吧 Win11蓝屏死循环解决办法分享。有用户安装W…

Ubuntu18.04系统及相关软件安装恢复过程

Ubuntu18.04系统及相关软件安装恢复过程 一、常用软件安装1. [系统安装](https://blog.csdn.net/qq_43309940/article/details/116656810)2. [显卡驱动安装](https://blog.csdn.net/qq_43309940/article/details/126898929)3. [ROS Melodic安装](https://ismango.blog.csdn.net…

[Python]爬虫基础——urllib库

urllib目录 一、简介二、发送请求1、urlopen()函数2、Request()函数 三、异常处理四、解析URL五、分析Robots协议 一、简介 urllib库是Python内置的标准库。包含以下四个模块&#xff1a; 1、request&#xff1a;模拟发送HTTP请求&#xff1b; 2、error&#xff1a;处理HTTP请…

实验六 UML建模工具应用

一、实验目的 1.掌握面向对象开发思想及实现机制 2.理解并掌握UML常用图&#xff08;重点&#xff1a;类、对象图、用例图&#xff09; 3.掌握并常见UML建模工具&#xff0c;并绘制UML各种图 二、实验准备与要求 1.StarUML(简称SU)&#xff0c;是一种创建UML类图&#xff0c…

洛谷P8597 [蓝桥杯 2013 省 B] 翻硬币C语言/C++

[蓝桥杯 2013 省 B] 翻硬币 题目背景 小明正在玩一个“翻硬币”的游戏。 题目描述 桌上放着排成一排的若干硬币。我们用 * 表示正面&#xff0c;用 o 表示反面&#xff08;是小写字母&#xff0c;不是零&#xff09;&#xff0c;比如可能情形是 **oo***oooo&#xff0c;如果…

ideaSSM医院挂号管理系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 SSM医院挂号管理系统是一套完善的完整医院类型系统&#xff0c;结合SSM框架和bootstrap完成本系统SpringMVC spring mybatis &#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式 开发&#xff09;&#xff0c;系统具有完整的源代…

leetcode 1143. 最长公共子序列

1. dp 数组的定义 下标&#xff1a; 以 i - 1 和 j - 1 为结尾的子序列 值&#xff1a;以 i - 1 和 j - 1 为结尾的最长公共子序列的长度 2. 递推公式 if(text1[i - 1] text2[j - 1]) // 相等 dp[i][j] dp[i - 1][j - 1] 1 ; elsedp[i][j] max(dp[i - 1][j],…