Qt::BlockingQueuedConnection 与 QMetaCallEvent

news/2024/9/20 3:43:49/文章来源:https://www.cnblogs.com/DesertCactus/p/18419039

Qt 创建连接类型如果是 Qt::BlockingQueuedConnection,即sender thread 与 receiver thread 不同,
但是要求 sender signal 与 receiver slot 执行是 不同线程间的同步行为。也即:在sender signal 发出后 sender线程 要 等待
receiver 线程的 slot 执行完后才能继续 向后执行指令。

该种方式sender与receiver的参数传递并未通过堆上内存的方式进行。而是receiver直接操作sender线程浅上的内存完成的。
因为sender线程处于同步等待状态,函数帧并未返回上一级函数调用者,因此sender的signal 函数桟帧数据处于有效状态。
又因为sender和receiver属于同一个进程,因此可以直接通过指针获取sender 线程调用栈中的内存数据

实现方式:


QSemaphore semaphore;
{
QMutexLocker locker(signalSlotLock(receiver));
if (!c->isSingleShot && !c->receiver.loadAcquire())
continue;
QMetaCallEvent *ev = c->isSlotObject ?
new QMetaCallEvent(c->slotObj, sender, signal_index, argv, &semaphore) :
new QMetaCallEvent(c->method_offset, c->method_relative, c->callFunction,
sender, signal_index, argv, &semaphore);
QCoreApplication::postEvent(receiver, ev);
}
semaphore.acquire();

使用信号量在线程间进行同步,当QMetaCallEvent 在 receiver 线程EventLoop 处理完成后 会通过
void QCoreApplicationPrivate::sendPostedEvents(QObject *receiver, int event_type,
QThreadData *data)
{
...........
...........
QScopedPointer event_deleter(e); // will delete the event (with the mutex unlocked)

QCoreApplication::sendEvent(r, e);  // after all that work, it's time to deliver the event.
...........

...........
}

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

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

相关文章

设备地址

设备地址 BLE的设备地址可以使用公共地址(Public Device Adress)或者随机地址(Random Device Address),一个BLE至少使用一种地址类型,当然也可以同时使用两种地址类型。 公共地址和随机地址一样,都是48位(6字节),BLE设备地址关系如下:公共地址:从IEEE申请(购买),I…

扫码详见阳子公众号

https://mp.weixin.qq.com/mp/qrcode?scene=10000004&size=102&__biz=MzkwNzc0MjQ1MA==&mid=2247484006&idx=1&sn=43425e98c08a3887b090c927d89cbe40&send_time= 或直接扫码:

使用Addressables+SpriteAtlas打包产生冗余

1)使用Addressables+SpriteAtlas打包产生冗余2)使用SBP打AssetBundle脚本引用丢失3)Unity构建后处理(IPostprocessBuildWithReport等接口)抛出异常后,构建不会停止4)Unity 2022.3.0版本使用Occlusion,PC运行良好但是安卓手机无效这是第400篇UWA技术知识分享的推送,精选…

如何编制一份数据分析报表?这篇文章告诉你重点

在当今数据驱动的时代,数据分析报表成为了企业决策中不可或缺的工具。它不仅可以帮助我们清晰地展现数据,还能揭示数据背后的趋势与问题,为管理者提供有力的支持。那么,如何编制一份高效、准确的数据分析报表呢?本文将从数据分析报表的分类、制作原则以及具体步骤来为你详…

centos7下安装Python3.7

centos7默认安装的是python2.7,然而python2基本上要淘汰了,所以有必要安装最新的python3 python,g++这些工具一般安装在/usr/bin目录里 通过指令ll python*可以看到python指向的是python2.7我们要安装python3,使python指向python3 下面开始具体步骤(参考其他大佬的方法,也…

wpf简单自定义控件

用户控件(User Control)和自定义控件(Custom Control)的区别: UserControl: 将多个WPF控件(例如:TextBox,TextBlock,Button)进行组合成一个可复用的控件组; 由XAML和Code Behind代码组成; 不支持样式/模板重写; CustomControl 自定义控件,扩展自一个已经存在的控件,并…

应用AI技术的销售进化论

该文章聚焦AI技术在销售行业中的实际应用,解读销售人员如何利用先进技术及工具突破传统限制,增强业务能力帮助销售人员保持竞争优势,提升工作效率与业绩。 1、AI如何重塑销售规则 1.1 AI在销售领域的应用:不只是数字游戏 在销售领域,AI技术的引入正在重塑传统的销售模式,…

yum报错

参考这篇文章:https://www.cnblogs.com/kohler21/p/18331060Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock error was 14: curl#6 - "Could not re…

STM32H723+DMA+ADC多通道 问题记录

出现的问题1: ADC当开启扫描模式、DMA开始连续模式的时候,依然只能读出第一个通道的ADC的值,后面通道的AD值不更新。 尝试过将buf 固定在RAM_D3中也没有用。 实际最后问题在于,用STM32CubeMX配置工具生成代码的时候,ADC初始化的函数放在了DMA初始化的前面导致的问题。 出现…

改变您的HTTP服务器的缺省banner

原文链接:https://www.cnblogs.com/zmbhfly/p/10510594.html改变您的HTTP服务器的缺省banner 针对 IIS Asp.net,改变您的HTTP服务器的缺省banner引自:https://www.cnblogs.com/felixnet/p/6344613.html测试可以用,但仅仅是修改的应用程序,http://localhost不起作用 https:…

Paper Reading: Deep forest auto-Encoder for resource-Centric attributes graph embedding

本文设计了一种基于深度森林的embedding 学习方法 GraphDF,该方法可以实现以资源为中心的加权属性图的属性和拓扑信息的嵌入。提出的图预处理器包括基于自注意机制的潜在隐含特征挖掘、基于相似性和模块化相关转换对潜在隐含关系特征的深度一般信息挖掘。使编码器所提取的原始…

Hadoop(十五)项目考核 WordCount案例

一、需求分析需求:在给定的文本文件中统计输出每一个单词出现的总次数 SEVENTEEN.txt文本内容如下:say the name seventeen hello we are seventeen nice to meet you you very nice按照MapReduce编程规范,分别编写Mapper,Reducer,Driver1、Mapper (1)将MapTask传过来的…