当前位置: 首页 > 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…...

libxlsxwriter条件格式

今天来看一个libxlsxwriter的高级用法&#xff1a;一个条件格式的示例。 说它“高级”&#xff0c;也是基于非Excel专家的小白们的视角。对&#xff0c;没错&#xff0c;本小白正是这样的小白。 1 一个简单的问题 来看我们今天的场景问题&#xff1a;有一列数据&#xff0c;有…...

nodejs+vue+elementui在线求助系统vscode

目 录 摘 要 1 前 言 3 第1章 概述 4 1.1 研究背景 4 1.2 研究目的 4 1.3 研究内容 4 第二章 开发技术介绍 5 前端技术&#xff1a;nodejsvueelementui,视图层其实质就是vue页面&#xff0c;通过编写vue页面从而展示在浏览器中&#xff0c;编写完成的vue页面要能够和控制器类进…...

电子技术——BJT差分输入对

电子技术——BJT差分输入对 本节我们来讨论BJT差分输入对。 共模输入 下图是BJT差分输入对的基本原理图&#xff1a; 首先我们考虑两端输入共模信号 VCMV_{CM}VCM​ &#xff1a; 此时 vB1vB2VCMv_{B1} v_{B2} V_{CM}vB1​vB2​VCM​ 因为电路的对称结构&#xff0c;所以 i…...

[MySQL教程②] - MySQL介绍和发展史

目录 ❤ MySQL介绍 ❤ 什么是数据库 ❤ 什么是数据 ❤ 数据库管理系统 ❤ NoSQL特性总览 ❤ NoSQL的分类、特点、典型产品 ❤ 常见的数据库产品有哪些&#xff1f; ❤ Oracle公司产品介绍 Oracle数据库版本介绍 Oracle的市场应用 MySQL数据库版本介绍 MyS…...

多表查询--实例

1 创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) ); 创建score表。SQL代码如下&#xff1a; CREATE TABLE score ( id INT…...

Differentially Private Grids for Geospatial Data

文章目录abstractintroabstract 在本文中&#xff0c;我们解决了为二维数据集(如地理空间数据集)构建差异私有概要的问题。目前最先进的方法通过执行数据域的递归二进制分区和构造分区的层次结构来工作。我们表明&#xff0c;基于分区的概要方法的关键挑战在于选择正确的分区粒…...

Java学习记录day8

类与对象 继承例题 https://www.bilibili.com/video/BV1PU4y1E7nX?p55&vd_source8f80327daa664c039f5c342a25bcbbae&#xff08;B站千峰马剑威Java基础入门视频第P55&#xff0c;记录的重要学习内容之一&#xff09; final关键字 作用&#xff1a; 声明一个常量&…...

Solon2 开发之容器,三、注入或手动获取 Bean

1、如何注入Bean&#xff1f; 先了解一下Bean生命周期的简化版&#xff1a; 运行构建函数尝试字段注入&#xff08;有时同步注入&#xff0c;没时订阅注入。不会有相互依赖而卡住的问题&#xff09;Init 函数&#xff08;是在容器初始化完成后才执行&#xff09;…释放&#…...

微信小程序_调用openAi搭建虚拟伙伴聊天

微信小程序_调用openAi搭建虚拟伙伴聊天背景效果关于账号注册接口实现8行python搞定小程序实现页面结构数据逻辑结速背景 从2022年的年底&#xff0c;网上都是chagpt的传说&#xff0c;个人理解这个chatgpt是模型优化训练&#xff0c;我们在用chatgpt的时候就在优化这个模型&a…...

硬件工程师入门基础知识(一)基础元器件认识(一)

硬件工程师入门基础知识 &#xff08;一&#xff09;基础元器件认识&#xff08;一&#xff09; 今天水一篇hhh。介绍点基础但是实用的东西。 tips&#xff1a;学习资料和数据来自《硬件工程师炼成之路》、百度百科、网上资料。 1.贴片电阻 2.电容 3.电感 4.磁珠 1.贴片电…...

香港公司如何做国内网站的备案/怎样在百度上注册自己的店铺

2019独角兽企业重金招聘Python工程师标准>>> 1、Gartner认可的首个中国数据库 2017巨杉数据库成为Gartner数据库年度报告首次选入的中国数据库厂商之一&#xff0c;与阿里云等共3家厂商成为中国数据库翘楚&#xff0c;得到海内外行业的认可。 此外&#xff0c;巨杉也…...

公司网站设计怎么做/苏州网站制作公司

HDU 3790 最短路径问题Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64uDescription 给你n个点&#xff0c;m条无向边&#xff0c;每条边都有长度d和花费p&#xff0c;给你起点s终点t&#xff0c;要求输出起点到终点的最短距离及其花费&…...

广州网站制作到诺然/宣城网站seo

上面那张图讲解了kafka中broker、生产者、消费者、topic、消息这几个概念&#xff0c;其中broker在物理上你可以理解为一台服务器上搭了一个kafka服务&#xff0c;这台就是broker0&#xff0c;另一台服务器搭建了一个kafka服务&#xff0c;这台就是broker1&#xff0c;前提是在…...

phpcms可以做网站吗/搜索引擎查询

解析 H.264 NAL Unit 帧类型的代码&#xff1a; 1 // 2 // 功能: 从 Nal Unit 数据中获取帧类型 3 // 读取字节结构体 4 typedef struct bs_t_T 5 { 6 unsigned char *pucStart; // 缓冲区首地址 7 unsigned char *pucCurrent; // 缓冲区当…...

网站开发与程序开发/上优化seo

T-CODE: MASS 批量更改MASS_CHARVAL 特征的批量维护MASS_EINE 信息记录的成批维护MASS_EKKO 采购订单的成批维护MASS_MARC 后勤/配送的成批维护MASS_MEAN 全球贸易项目编号的批量维护MASS_VENDOR 供应商的成批维护MASSD 批量维护MASSOBJ 维护大量维护对象MASSS2V 将系统变式复制…...

天河做网站系统/营销型网站建设报价

本人屌丝本一枚,从最早的9.10京东到现在,找工作基本已经结束,除了腾讯的是暑期内推的(8.26面试的),校招期间一共面了四家,其中三家已经收到offer(京东阿里去哪儿),网易还在等通知中。如题,本人只是一个水得不能再水的本科生,大学四年,挂科5-6门的样子(这学期还要重修三门,妈蛋,…...