connect信号槽的异步性导致多线程中的数据被更改及Qt::BlockingQueuedConnection作用

目录

1. 问题现象       

2. 原因分析

3. 解决方法


1. 问题现象       

       因为业务需求,需要利用子线程向主线程发送数据。像这种子线程和主线程进行数据交互时,一般都是通过Qt的信号槽机制来实现。如下代码:

void myClass::doBusiness()
{...... // 其它代码略connect(this, &myClass::mySignal, m_pBusiness, &CMyBusiness::processBusiness);// 开启业务数据线程auto pDataThread = new std::thread(&myClass::dataThreadFun, this);...... // 其它代码略}// 数据线程函数
void myClass::dataThreadFun()
{// 无限循环,一直处理业务while (true){...... // 其它代码略char* p = data; // data数据在while的每轮循环中都会被更改emit mySignal(p);}
}// 业务处理类,位于主线程
void CMyBusiness::processBusiness(char* pData)
{// 取出pData做一些处理
}

其中m_pBusiness为CMyBusiness类对象,在线程函数dataThreadFun中的以参数p发送信号mySignal,以让CMyBusiness类的processBusiness(char* pData)得以执行,但测试发现,在processBusiness函数中,参数pData和mySignal信号发送过来的数据不一样,数据被更改了。

2. 原因分析

      问题的原因是第5行connect信号槽时,采用默认连接方式,即Qt::AutoConnection方式,Qt官方对该方式的说明如下:

(Default) If the receiver lives in the thread that emits the signal, Qt::DirectConnection is used. Otherwise, Qt::QueuedConnection is used. The connection type is determined when the signal is emitted.

即:如果接收信号的对象和发送信号的对象位于同一个线程,则采取Qt::DirectConnection连接;否则就采取Qt::QueuedConnection方式。当信号被发送时,Qt会探测以决定采取Qt::DirectConnection连接方式还是采取Qt::QueuedConnection连接方式。

       对上面的代码段,CMyBusiness即为接收信号的对象,m_pBusiness位于主线程,发送信号对象位于子线程,根据上面的说明,所以第5行的connect采取的是Qt::QueuedConnection连接类型。而Qt对Qt::QueuedConnection的解释如下:

The slot is invoked when control returns to the event loop of the receiver's thread. The slot is executed in the receiver's thread.

意思是说:当控制返回接收对象的事件循环时,槽函数才会被执行,槽函数是在接收者所在线程执行的 。也就说Qt::QueuedConnection连接模式就是把信号(类似事件)放到接收者的事件队列中,仅仅只是放入,但不是立即执行,而是等循环到该信号(事件)时才执行,这就会和上面代码的dataThreadFun表示的子线程产生一个时间差,就是在这个时间内,数据被更改了,其是通过上面代码的22行更改的。

3. 解决方法

       解决该问题的方法是上面第5行的connect函数最后一个参数,不要采用默认的Qt::AutoConnection连接方式,而是采用Qt::BlockingQueuedConnection连接方式。Qt官方对Qt::BlockingQueuedConnection解释如下:

Same as Qt::QueuedConnection, except that the signalling thread blocks until the slot returns. This connection must not be used if the receiver lives in the signalling thread, or else the application will deadlock.

意思是说:同Qt::QueuedConnection类似,唯一不同的是:发送信号的线程将会一直阻塞,直到接收信号的槽函数执行后才继续往下执行。这种连接方式不能用于接收信号的对象和发送信号对象都在同一个线程的情况,否则会引起死锁。

        采取Qt::QueuedConnection连接方式后,上面的子线程dataThreadFun在发送信号后会阻塞,直到CMyBusiness类的processBusiness函数执行后才继续往下执行,所以数据就不会被更改。

Qt::BlockingQueuedConnection连接方式不能用于接收信号的对象和发送信号对象都在同一个线程的情况,否则会引起死锁,这很好理解,如果位于同一线程,就会造成你等我,我也等你,大家相互等待对方执行完后再执行,就会造成死锁。

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

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

相关文章

0x42 树状数组

0x42 树状数组 若一个正整数 x x x的二进制表示为 a k − 1 a k − 2 . . . a 2 a 1 a 0 a_{k-1}a_{k-2}...a_2a_1a_0 ak−1​ak−2​...a2​a1​a0​,其中等于1的位是 { a i 1 , a i 2 , . . . , a i m } \{a_{i_1},a_{i_2},...,a_{i_{m}}\} {ai1​​,ai2​​,...…

鸿蒙原生应用再添新丁!喜马拉雅入局鸿蒙

鸿蒙原生应用再添新丁!喜马拉雅入局鸿蒙 来自 HarmonyOS 微博12月20日消息, #喜马拉雅正式完成鸿蒙原生应用版本适配#,作为音频业巨头的喜马拉雅 ,将基于#HarmonyOS NEXT#创造更丰富、更智慧的全场景“声音宇宙”!#鸿…

Python 正则表达式入门:轻松掌握字符串匹配的艺术

Python 正则表达式入门:轻松掌握字符串匹配的艺术 引言:什么是正则表达式?基础知识:正则表达式的语法和规则Python中的正则表达式:re模块的使用实战应用:常见的正则表达式案例最佳实践与常见错误结语&#…

python+selenium+HTMLTestRunner生成测试报告并发送邮件给指定邮箱

配置邮件发送人及接收人,并执行测试用例,最后发送测试报告到指定邮箱(注意:打开测试报告目录后,最后记得关闭,不然邮箱接收到的测试报告内容将会为空) import time import unittest import os …

格密码:LWE设计公钥密码系统

目录 一. LWE公私钥对 二. 怎么加密? 三. 怎么解密? 四. 正确性分析 五. 安全性 在格密码中,LWE(Learning With Errors)问题非常重要,本文章将介绍一些基于LWE设计的公钥密码方案,并详细讨论这些方案是如何运行的…

oracle怎样才算开启了内存大页?

oracle怎样才算开启了内存大页? 关键核查下面三点: 1./etc/sysctl.conf vm.nr_hugepages16384这是给了32G,计划sga给30G,一般需多分配2-4G sysctl -p生效 看cat /proc/meminfo|grep Huge啥结果? 这种明显是配了…

蓝牙物联网开发与应用:五大核心应用场景!

蓝牙技术在物联网中的五大核心应用场景 1、智能家居 通过蓝牙连接智能家居设备,如智能灯泡、智能插座、智能恒温器等,可以实现远程控制、语音控制等功能,提高家居的智能化程度和便利性。 2、智能穿戴设备 蓝牙技术可以连接智能手表、智能手…

01AVue入门(持续学习中)

1.使用AVue开发简单的前端页面直接简单到起飞,他是Element PlusVueVite开发的,不需要向元素的前端代码一样一个组件要传很多参数,他可以使用Json文本来控制我们要传入的数据结构来决定显示什么 //我使用的比较新,我们也可以使用cdn直接使用script标签直接引入 2.开发中遇到的坑…

共享目录搭建

【linux系统】 1.sudo yum install nfs-utils 或 sudo apt install nfs-common 问题:如果apt install nfs-common报错dpkg: error processing package rpcbind (--configure) 解决方法:删除所有信息之后update sudo mv/var/lib/dpkg/info/ /va…

鸿蒙ArkTS语言介绍与TS基础法

1、ArkTS介绍 ArkTS是HarmonyOS主力应用开发语言,它在TS基础上,匹配ArkUI框架,扩展了声明式UI、状态管理等响应的能力,让开发者以更简洁、更自然的方式开发跨端应用。 JS 是一种属于网络的高级脚本语言,已经被广泛用…

【ITK库学习】使用itk库进行图像配准:“Hello World”配准(一)

目录 1、itkImageRegistrationMethod / itkImageRegistrationMethodv42、itkTranslationTransform3、itkMeanSquaresImageToImageMetric / itkMeanSquaresImageToImageMetric44、itkRegularStepGradientDescentOptimizerv / itkRegularStepGradientDescentOptimizerv4 图像配准…

MyBatis的ORM!!!

首先你要明白为什么使用ORM:我们看一个示例,我们发现我们要声明的pojo类中的属性名和数据库中的字段名不一致,这时就需要我们使用MyBatis的ORM。 首先还是准备工作: 1.创建Maven工程,还没有配置Maven的和还不会的去看这…

2023年12月20日学习总结

今日to do list: 学习kaggle中store sales中的dart forcasting🎯 大概搜集一个声纹识别的报告(老师给的新项目😭) 学习时不刷手机 okkkkkkkkkkkkkk 开始👍 1. 时间序列预测- a complete guide 总结一下这…

mysql创建用户和赋权

1.创建用户 CREATE USER new_userlocalhost IDENTIFIED BY user_password; “localhost"只允许本地连接,而”%"允许所有IP地址都可以连接到服务器。 2.赋权 GRANT ALL PRIVILEGES ON database_name.* TO new_userlocalhost; FLUSH PRIVILEGES; 3.给…

Python调用谷歌翻译API实现文本翻译

语种缩略表示 LANGUAGES {af: afrikaans,sq: albanian,am: amharic,ar: arabic,hy: armenian,az: azerbaijani,eu: basque,be: belarusian,bn: bengali,bs: bosnian,bg: bulgarian,ca: catalan,ceb: cebuano,ny: chichewa,zh-cn: chinese (simplified),zh-tw: chinese (tradi…

【C++初阶】学习string类的模拟实现

目录 前言:一、创建文件和类二、实现string类2.1 私有成员和构造函数2.2 析构函数2.3 拷贝构造函数2.3.1 写法12.3.2 写法2 2.4 赋值重载函数2.4.1 写法12.4.2 写法2 2.5 迭代器遍历访问2.6 下标遍历访问2.7 reserve2.8 resize2.9 判空和清理2.10 尾插2.10.1 尾插字…

计算机组成原理综合2

21、和外存储器相比,内存储器的特点是________。C A. 容量大、速度快、成本低 B. 容量大、速度慢、成本高 C. 容量小、速度快、成本高 D. 容量小、速度快、成本低 22、某计算机字长16位,存储器容量64KB,若按字编址&#xf…

diffusers-Inpainting

原文链接:添加链接描述 白色mask区域仅使用生成出来的,非白色mask区域使用原始影像,但是图像有点不平滑 import PIL import numpy as np import torchfrom diffusers import AutoPipelineForInpainting from diffusers.utils i…

Ubuntu 常用命令之 gzip 命令用法介绍

gzip 是一个在 Linux 和 Unix 系统中常用的文件压缩工具。它的名字来源于 GNU zip,作为一个自由软件,它是 GNU 项目的一部分。gzip 命令通常用于压缩文件,以节省磁盘空间,或者减小文件的大小,以便于网络传输。 gzip 命…

音视频直播核心技术介绍

直播流程 采集: 是视频直播开始的第一个环节,用户可以通过不同的终端采集视频,比如 iOS、Android、Mac、Windows 等。 前处理:主要就是美颜美型技术,以及还有加水印、模糊、去噪、滤镜等图像处理技术等等。 编码&#…