当前位置: 首页 > news >正文

线程和QObjects

QObject的可重入性: 

QThread继承了QObject,它发出信号以指示线程开始或完成执行,并提供一些插槽。

QObjects可以在多个线程中使用发出调用其他线程中槽的信号,并将事件发布到在其他线程中“活动”的对象。这是可能的,因为允许每个线程都有自己的事件循环。

QObject是可以重入的。它的绝大数非GUI子类,如QTimer,QTcpSocket,QUdpSocket和QProcess,都是可以重入的,使得可以从多个线程同时使用这些类。

注意:这些类要在从单个线程中创建和使用,在一个线程中创建对象并从另一个线程调用其函数不能保证有效。需要注意以下3点:

  • 必须始终在父级的线程中创建QObject的子级,意味着,除其他事项外,永远不应该将QThread对象(this)作为在线程中创建的对象的父级传导(因为QThread对象本身在另一个线程中创建的)
  • 事件驱动对象自能在单一的线程中使用。具体来说,这适用于的定时器和网络模块,例如不可在对象所在线程中QObject::thread()以外的其他线程中启动一个定时器或连接一个套接字。
  • 必须确保删除QThread对象以前删除在该线程中创建的所有对象,可以通过在run()函数中的栈上创建对象来确保这一点

虽然QObject是可重入的,但GUI类,特别是QWidget以及其子类,都是不是可重入的,它们只能从主线程中使用QCoreApplication::exec()也需要在主线程中调用。

实际上,可以通过将耗时的操作放在单独的工作线程中并在工作线程完成后在主线程的屏幕上显示结果, 可以轻松解决在主线程以外的其他线程中使用 GUI 类的不可能性。

通常,不支持在 QApplication 之前创建 QObjects,这可能会导致退出时出现奇怪的崩溃,具体取决于平台。这意味着 QObject 的静态实例也不受支持的。结构合理的单线程或多线程应用程序应使 QApplication 成为第一个创建,最后一个销毁的 QObject。

每个线程的事件循环:

每个线程都可以有自己的事件循环。

初始线程使用 QCoreApplication::exec() 启动其事件循环,或者对于单对话框 GUI 应用程序,有时使用 QDialog:exec()。其他线程可以使用 QThread::exec() 启动事件循环。与QCoreApplication一样,QThread提供了一个exec()函数和一个quit()插槽。

线程中的事件循环使线程可以使用某些需要存在事件循环的非 GUI Qt 类,它还可以将来自任何线程的信号连接到特定线程的插槽。

 QObject实例被称为驻留在创建它的线程中。该对象的事件由该线程的事件循环调度,QObject中的线程可以使用QObject::thread()使用。可以使用QObject::moveToThread()函数更改对象其子线程相关性。

从拥有对象的线程以外的线程调用QObject是不安全的,除非能保证该对象当时不处理事件。改用QObject::deleteLater(),将发布一个DeferredDelete事件,对象线程的事件循环最终将拾取该事件。默认情况下,拥有 QObject 的线程是创建 QObject 的线程,但在调用QObject::moveToThread() 之后则不是

如果未运行任何事件循环,则不会将事件传递到对象。例如,如果您在线程中创建了一个 QTimer 对象,但从不调用 exec(),则 QTimer 将永远不会发出其 timerout() 信号。调用 deleteLater 也不起作用。(这些限制也适用于主线程。)

所有线程都支持事件过滤器,但限制是监视对象必须与受监视对象位于同一线程中.

从其他线程中访问QObject子类:

QObject 和它所有的子类都不是线程安全的,这包括整个事件传递系统。需要时刻记着,正在从其他线程中访问一个对象时,事件循环可能正在向这个对象传递事件。

如果调用一个没有在当时线程中的QObject子类的函数,而这个对象有可能会获取事件,那么就必须使用mutex来保护对这个QObject子类的内部数据的所有访问,否者,可能出现崩溃或则其他以外行为。

与其他对象像是,QThread对象,居住于常见该对象的线程。在QThread子类中提供槽一般时不安全的,除非使用mutex来保护成员变量。但是,可以安全地在Qthread::run函数中发射信号,因为信号发射是线程安全的。

跨越线程的信号与槽:

Qt支持以下信号与槽连接类型

可已通过向connect()函数传递附加的参数来指定关联类型,注意,如果在接收者线程中由一个事件循环,那么当发送者与接收者在不同的线程中时,使用Direct Connection是不安全的,类似的,调用其他线程中的对象的任何函数也是不安全的。

 QObject::connect() 是线程安全的

  • Auto Connection(自动连接,默认),如果在接收对象具有关联的线程中发出信号,则行为与直接连接相同。否则,该行为与排队连接相同。
  • Dirct Connection(直接连接)会立即调用该插槽。插槽在发射器的线程中执行,该线程不一定是接收器的线程。
  • Queued Connection(排队连接)当控制返回到接收器线程的事件循环时,将调用该槽。该插槽在接收器的线程中执行。
  • Blocking Queued Connection(阻止排队连接)
  • 该槽的调用方式与排队连接一样,但当前线程块除外,直到槽返回。(使用此类型连接同一线程中的对象将导致死锁。)
  • Unique Connection(唯一连接)该行为与自动连接相同,但仅当它不复制现有连接时,才会建立连接。即,如果同一信号已经连接到同一对对象的同一插槽,则不会建立连接并且 connect() 

参考文档:

Threads and QObjects | Qt 5.15

相关文章:

线程和QObjects

QObject的可重入性: QThread继承了QObject,它发出信号以指示线程开始或完成执行,并提供一些插槽。 QObjects可以在多个线程中使用发出调用其他线程中槽的信号,并将事件发布到在其他线程中“活动”的对象。这是可能的&#xff0…...

最新中文版FL Studio21水果软件下载安装图文教程

FL Studio是目前流行广泛使用人数最多音乐编曲制作软件,这款软件相信广大网友并不陌生,今天带来的是FL中文版本,所有的功能都能在线编辑,用户直接就能操作,同时因为是21水果是最新版,所以增加了新的功能&am…...

pandas数据分析35——多个数据框实现笛卡尔积

什么是笛卡尔积。就是遍历所有组合的可能性。 比如第一个盒子有[1,2,3]三个号码球,第二个盒子有[4,5]两个号码球。那么从每个盒子里面分别拿一个球共有3*2两种可能性,其集合就是{[1,4],[2,4],[3,4],[1,5],[2,5],[3,5]},这个就是笛卡尔积。 三个盒子也是…...

【C语言学习笔记】:数组倒序排列,数组倒置

数组倒置就是将数组元素中的数据倒过来&#xff01; 举个例子&#xff0c;比如下面程序&#xff1a; #include <stdio.h>int main(void) { int a[5] {1, 2, 3, 4, 5}; int b[5]; //用来存放倒置后的数据 int i, j; for (i0, j4; i<5, j>0; i, --j)…...

sni+tomcat漏洞复现

sni SNI产生背景 SSL以及TLS&#xff08;SSL的升级版&#xff09;为客户端与服务器端进行安全连接提供了条件。但是&#xff0c;由于当时技术限制&#xff0c;SSL初期的设计顺应经典的公钥基础设施 PKI(Public Key Infrastructure)设计&#xff0c;PKI 认为一个服务器只为一个…...

Linux ALSA 之十:ALSA ASOC Machine Driver

ALSA ASOC Machine Driver一、Machine 简介二、ASoC Machine Driver2.1 Machine Driver 的 Platform Driver & Platform Device 驱动模型2.2 在 Probe() 中注册声卡三、snd_soc_register_card 函数3.1 bind DAIs3.2 New a sound card3.3 Create card new widgets3.4 Probe …...

Spring 面试题(一):Spring 如何处理全局异常?

❤️ 博客首页&#xff1a;水滴技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; &#x1f338; 订阅专栏&#xff1a;Spring 教程&#xff1a;从入门到精通 文章目录1、如何处理全局异常2、代码示例2.1、定义统一的“响应结果对象”2.2、…...

Threadlocal为何引发内存泄漏问题

首先我们要先了解什么是泄漏问题和什么是内存溢出 内存泄漏表示程序员申请了内存&#xff0c;但是该内存一直无法被释放 内存溢出表示申请内存不足&#xff0c;就会报错 为何引发内存泄漏问题 因为每个线程都有自己独立的ThreadLocalMap对象&#xff0c;key为ThreadLocal&…...

如何写好 Python 的 Lambda 函数?

当你需要完成一件小工作时&#xff0c;在本地环境中使用这个函数&#xff0c;可以让工作如此得心应手&#xff0c;它就是 Lambda 函数。 Lambda 函数是 Python 中的匿名函数。有些人将它们简称为lambdas&#xff0c;它们的语法如下&#xff1a; lambda arguments: expression…...

大数据技术架构(组件)32——Spark:Spark SQL--Execute Engine

2.2、Spark SQL2.2.1、Execute EngineSparkSql的整体提交执行流程和Hive的执行流程基本上一致。站在通用的角度&#xff0c;对于SparkSql来说&#xff0c;从Sql到Spark的RDD执行需要经历两个大的阶段&#xff1a;逻辑计划和物理计划逻辑计划层面会把用户提交的sql转换成树型结构…...

Leetcode.1138 字母板上的路径

题目链接 Leetcode.1138 字母板上的路径 Rating &#xff1a; 1411 题目描述 我们从一块字母板上的位置 (0, 0)出发&#xff0c;该坐标对应的字符为 board[0][0]。 在本题里&#xff0c;字母板为board ["abcde", "fghij", "klmno", "pqr…...

一个自动配置 opengrok 多项目的脚本

前段时间在服务器上配置 opengrok 阅读代码&#xff0c;项目有很多个&#xff0c;一个一个手动配置比较繁琐。 我从搭建 tomcat 和 opengrok&#xff0c;到配置和索引完 5 个 Android 项目&#xff0c;用了差不多一整天。 要是再让我手动配置几个项目&#xff0c;估计真要崩溃…...

JAVA同步代码块 同步方法

JAVA同步代码块 & 同步方法 为了解决多线程操作共享数据时产生的安全问题 例如以下代码 if (ticket < 0) {// 卖完了break; } else {ticket--;System.out.println(Thread.currentThread().getName() "在卖票&#xff0c;还剩下" ticket "张")…...

分享111个助理类简历模板,总有一款适合您

分享111个助理类简历模板&#xff0c;总有一款适合您 111个助理类简历模板下载链接&#xff1a;https://pan.baidu.com/s/1JafYuLPQMmq37K4V0wiqWA?pwd8y54 提取码&#xff1a;8y54 Python采集代码下载链接&#xff1a;https://wwgn.lanzoul.com/iKGwb0kye3wj 设计师助理…...

Allegro如何更改临时高亮的颜色设置操作指导

Allegro如何更改临时高亮的颜色设置操作指导 在用Allegro做PCB设计的时候,当移动或者高亮某个对象之前,会被临时高亮一个颜色,方便查看,类似下图 运行高亮命令的时候,器件被临时高亮成了白色 软件默认的是白色,如何更改成其它颜色? 具体操作如下 点击Display选择Color…...

知识图谱嵌入技术研究综述

作者 张天成 1 , * 田 雪 1 , * 孙相会 1 , * 于明鹤 2 , * 孙艳红 1 , * 于 戈 摘要 知识图谱 是一种用图模型来描述知识和建模事物之间的关联关系的技术。 知识图谱嵌入 作为一种被广泛采用的知识表示方法。 主要思想是将知识图谱中的实体和关系嵌入到连续的向量空间中…...

Scratch少儿编程案例-水果忍者-超完整

专栏分享 点击跳转=>Unity3D特效百例点击跳转=>案例项目实战源码点击跳转=>游戏脚本-辅助自动化点击跳转=>Android控件全解手册点击跳转=>Scratch编程案例👉关于作者...

练 习

1.判断三个中最重的//依次输入相应的人的体重double people1, people2, people3;cout << "请输入第一个人体重" << endl;cin >> people1;cout << "请输入第二个人体重" << endl;cin >> people2;cout << "请…...

Urho3D整体结构

Urho3D引擎编译成一个库。从概念上讲&#xff0c;它由几个代表不同子系统或功能的“子库”组成。其中每个都位于Source/Urho3D目录下的子目录中&#xff1a; 容器:提供STL替换类和共享指针。数学:提供相交测试中使用的矢量、四元数和矩阵类型以及几何形状。Core:提供执行上下文…...

大数据技术之Hudi

Hudi概述 1.1 Hudi简介 Apache Hudi&#xff08;Hadoop Upserts Delete and Incremental&#xff09;是下一代流数据湖平台。Apache Hudi将核心仓库和数据库功能直接引入数据湖。Hudi提供了表、事务、高效的upserts/delete、高级索引、流摄取服务、数据集群/压缩优化和并发&a…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...