qt源码---事件系统之QCoreApplication

上一节分析了qt和windows系统之间的消息的传递,本节着重看一下,qt内部的事件是如何传递的?

1.sendEvent函数

在使用的自定义事件时,有时需要手动抛出一个事件,常用的方式有2种,其一时阻塞式的sendEvent函数;其二是postEvent函数;sendEvent函数定义如下:

其主要是将spont设置为fasle,然后转入到notifyInternal2函数中执行处理;

其中self在QCoreApplicationPrivate构造函数中已被指定,所以不为空,if(!self && selfRequired)不会执行;

QInternal::activateCallbacks函数,会检测是否注册了事件回调函数,如果注册了对应的事件函数,会截获此事件;其对应的定义如下:

 由于在实践项目中没有用过此种方式,此处略过

接下来会通过QScopedScopeLevelCounter类将接收对象的scopeLevel变量加1,并在函数退出时,减一;此处猜测是qt标识循环层级使用的,实际是做什么用的,还不清楚;

接下来会转入doNotifity函数处理,notify函数最终也是转入doNotify函数中处理;

此处会检测接收对象和发送对象是否在同一个线程;并最终转入notify_helper函数中处理;

 

 此处会判断接收的对象是否在主线程中,如果是在主线程中,会检测QCoreApplication的对象是否安装了事件过滤器,如果此事件被QCoreApplication事件过滤器检测到并被处理,并不会向下传递;

接下来会判断此接收对象上的事件过滤器是否处理此事件,如果此事件被处理则退出;

最后,进入接收对象自己的event函数,进行事件处理;

通过上述流程可以发现:1、event对象在事件传递过程中,没有执行删除等释放动作,其内存需要用户自己管理;2、sendEvent函数一直在执行函数的调用,并最终转到notify_helper函数中处理,所以其是阻塞式调用;3、事件的传递顺序,先被QCoreApplication对象拦截,接着被对象注册的事件过滤器拦截,最后执行自己的event函数;

2、postEvent函数

 

首先判断接收对象是否为空,如果为空,删除event对象,并退出;

判断接收对象的线程是否被释放,如果接收对象所在的线程已被删除,则删除event对象,并退出;

如果接收对象被移动到其他线程中,再次检测新的线程是否被删除,如果新的线程已被删除,则删除event对象,并退出;

判断事件是否可以被压缩,即删除已经在postEventList中重复的事件,主要针对QTimerEvent事件、QDeferredDeleteEvent、QQuitEvent等事件;

 接下来,执行:

 将QEvent对象放入QScopedPointer中,将receiver、event对象拼装成QPostEvent对象,并放入到QPostEventList中,如果中间出现异常,则event对象内存有QScopedPointer对象回收;

QPostEventList是根据priority优先级进行排序执行的;

接下来将event->posted置为true,postedEvents数量加1,并将canWait设置为false;

最后调用QAbstractEventDispatcher的wakeUp函数;wakeUp函数会调用WinAPI的PostMessage函数,投递一个WM_QT_SENDPOSTEDEVENTS事件,其会被processEvent函数捡取到,并最终转入QCoreApplicationPrivate中的sendPostedEvents函数处理(具体可以参考上一节);

 

 首先判断receiver对象是否为空,是否跨线程执行?由于通过QAbstractEventDispatcher对象调用,其receiver对象为空,所以此处会跳过执行;

将recursion加1,防止递归调用;并判断postEventList列表中是否有事件,如果没有事件需要处理则退出;

接下来主要是从QPostEventList中取出事件,并调用QCoreApplication::sendEvent函数处理;

并且会在此处删除event对象,由QScopedPointer对象负责处理;

另外qt在处理取事件的过程中非常小心,考虑了很多异常情况

期间定义了CleanUp的类,主要是用来处理事件对象被处理后,清空事件列表中已经处理过的事件;

总结:

sendEvent函数:

1、event对象在事件传递过程中,没有执行删除等释放动作,其内存需要用户自己管理;

2、sendEvent函数一直在执行函数的调用,并最终转到notify_helper函数中处理,所以其是阻塞式调用;

3、事件的传递顺序,先被QCoreApplication对象拦截,接着被对象注册的事件过滤器拦截,最后执行自己的event函数;

postEvnet函数:

1、event对象会被保存在全局的postEventList列表中,由事件在处理时被释放;

2、postevent函数会将事件、receiver对象放到全局的QPostEventList列表中,并通过WINAPI的postmessage系统函数,通知QAbstractEventDispatcher类检索到,最终转入到sendPostedEvents函数中处理;

3、上一节已提到windows消息及qt自定义消息如何被检索的过程,所以可以判断出postevent函数的处理是异步的过程;

QCoreApplication类的主要内容已基本结束,下一节会着重介绍下定时器事件;

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

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

相关文章

Kubernetes(K8s)从入门到精通系列之十:使用 kubeadm 创建一个高可用 etcd 集群

Kubernetes K8s从入门到精通系列之十:使用 kubeadm 创建一个高可用 etcd 集群 一、etcd高可用拓扑选项1.堆叠(Stacked)etcd 拓扑2.外部 etcd 拓扑 二、准备工作三、建立集群1.将 kubelet 配置为 etcd 的服务管理器。2.为 kubeadm 创建配置文件…

微服务间消息传递

微服务间消息传递 微服务是一种软件开发架构,它将一个大型应用程序拆分为一系列小型、独立的服务。每个服务都可以独立开发、部署和扩展,并通过轻量级的通信机制进行交互。 应用开发 common模块中包含服务提供者和服务消费者共享的内容provider模块是…

K8S系列文章 之 编写自动化部署K8S脚本

介绍 通过ansible脚本shell实现自动化部署k8s基础集群(v1.25.0) 部署结构 1. 通过二进制部署包镜像安装k8s集群、目录etcd节点只支持1-3个节点、最多三个etcd节点 2. 因k8s版本相对较新、需要升级内核来支持后台程序、当前版本只支持Cento7,内核版本(5.19.4-1.el7…

Object Map 的相互转换

学生业务对象定义&#xff1a;Student Student student new Student(); student.setId(1L); student.setName("令狐冲") student.setAge(10) 第一种&#xff1a;通过Alibaba Fastjson实现 pom.xml 文件依赖 <dependency><groupId>com.alibaba</g…

【EI/SCOPUS征稿】第三届电子通信与计算机科学技术国际学术会议(ECCST 2023)

第三届电子通信与计算机科学技术国际学术会议&#xff08;ECCST 2023&#xff09; 2023 3rd International Conference on Electronic Communication,Computer Science and Technology 2023年电子通信与计算机科学技术国际学术会议定于2023年9月15-17日在中国上海举行。会议旨…

培训报名小程序报名功能开发

目录 1 创建页面2 新建URL参数3 课程详细信息4 报名数据源创建5 报名信息功能开发6 设置页面跳转7 最终实现的效果总结 在培训报名小程序中&#xff0c;我们已经开发了首页和列表页。在列表页点击报名时就跳转到报名页面&#xff0c;先看我们的原型 报名页分为两个部分&#x…

ABAQUS启动GPU加速计算

文章目录 系统说明CUDA安装安装cuDNNABAQUS设置Lamb波压电仿真 系统说明 基于笔记本电脑&#xff0c;RTX4060&#xff0c;win11系统。 ABAQUS的有限元求解器是基于CPU的&#xff0c;但是它也支持使用GPU进行加速计算。仅支持隐式求解器standard。显示求解器explicit不能用。 …

Golang之路---04 并发编程——WaitGroup

WaitGroup 为了保证 main goroutine 在所有的 goroutine 都执行完毕后再退出&#xff0c;前面使用了 time.Sleep 这种简单的方式。 由于写的 demo 都是比较简单的&#xff0c; sleep 个 1 秒&#xff0c;我们主观上认为是够用的。 但在实际开发中&#xff0c;开发人员是无法…

【大数据】Flink 详解(二):核心篇 Ⅰ

Flink 详解&#xff08;二&#xff09;&#xff1a;核心篇 Ⅰ 14、Flink 的四大基石是什么&#xff1f; ​ Flink 的四大基石分别是&#xff1a; Checkpoint&#xff08;检查点&#xff09;State&#xff08;状态&#xff09;Time&#xff08;时间&#xff09;Window&#xff…

《面试1v1》ElasticSearch架构设计

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

AWS多账户单点登录 IAM Identity Center(AWS SSO)

需求场景 多个aws账户&#xff0c;登陆麻烦且不安全&#xff0c;SSO单点功能并且外部身份提供者 — 如果您要管理外部身份提供者&#xff08;IdP&#xff09;&#xff08;例如 Okta 或 Active Directory&#xff09;中的用户。 官方文档&#xff1a;https://docs.aws.amazon.c…

Linux命令200例:cd用于改变当前工作目录(常用)

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

神策数据桑文锋:三引擎赋能保险行业数字化客户经营

伴随着市场环境的变化&#xff0c;神策数据围绕数字化客户经营的思考也在不断迭代。 移动互联网时代是流量红利的时代&#xff0c;企业常用低成本的方式进行获客&#xff0c;“增长黑客”的概念大范围传播&#xff1b;数字化转型时代是触点红利的时代&#xff0c;要求“全渠道&…

【沁恒蓝牙mesh】CH58x USB功能开发记录(一)

本文主要介绍基于【沁恒蓝牙mesh】CH58x USB功能&#xff0c;结合SDK提供的代码包分析USB的基本常识 【沁恒蓝牙mesh】CH58x USB功能开发记录&#xff08;一&#xff09; 1. USB基本常识1.1 **USB 设备类别&#xff1a;**1.2 **USB设备实现方法&#xff1a;**1.3 **CDC设备&…

Vue2:组件高级(下)

Vue2&#xff1a;组件高级&#xff08;下&#xff09; Date: May 25, 2023 Sum: 自定义指令、插槽、商品列表、动态组件 目标&#xff1a; 自定义指令 基础概念&#xff1a; 概念&#xff1a; 内置指令&#xff1a;vue 官方提供了 v-for、v-model、v-if 等常用的内置指令。…

Unity之获取用户地理位置

1.直接利用三方API获取: 1.1 利用bilibili的api 【未知稳定性】 public void Awake() {StartCoroutine(GetLocationInfoNew());}/// <summary>/// 利用bilibili的接口通过ip直接获取城市信息/// </summary>IEnumerator GetLocationInfoNew() {//UnityWebRequest …

Java【抽象类和接口】(2)【浅拷贝、深拷贝、object类】

一、Clonable 接口和深拷贝 1.clone接口的使用 注意以下几个点&#xff1a; import javax.jws.soap.SOAPBinding;class Person implements Cloneable{public String name;public int age;public Person(String name, int age) {this.name name;this.age age;}Overridepublic…

Redis探索之旅

目录 今日良言&#xff1a;有志者自有千计万计&#xff0c;无志者只感千难万难 一、简介 二、Redis的安装 三、Redis的简单使用 四、Redis相关知识点 1.缓存分类 2.五大基本数据类型使用 3.持久化 4.常见面试题 今日良言&#xff1a;有志者自有千计万计&#xff0c;无…

正运动亮相2023半导体设备材料与核心部件展示会,助力半导体产业高速高精应用

■展会名称&#xff1a; 第11届&#xff08;2023&#xff09;半导体设备材料与核心部件展示会 ■展会日期 2023年8月9日-11日 ■展馆地点 无锡太湖国际博览中心A6馆 ■展位号 A6-A361 正运动技术&#xff0c;作为国内领先的运动控制企业&#xff0c;将于2023年8月9日参加…

Visual Studio 2022安装教程(英文版)

文章目录 1.下载安装 1.下载 官网地址&#xff1a;https://visualstudio.microsoft.com/zh-hans/vs/ 选择第一个社区版本&#xff1a;Community 2022 安装 1.将下载好的文件保存到桌面&#xff0c;双击点开 2.等待visual studio installer配置好 3.点击安装后会来到配件选…