Qt源码解读(一)Windows消息循环和事件循环机制

6 篇文章 0 订阅

背景摘要

本人面试某个互联网公司时,被问到了windows的消息机制。由于本人一直用Qt写界面,没有接触底层原理,所以对此只有大概猜测。为了能够弄清楚这些,遂阅读源码,以解吾惑,若从中有所收获则更令人欣慰。

先看大佬的文章:
https://www.cryfeifei.cn/2020/06/27/shen-ru-liao-jie-qt-xiao-xi-xun-huan-ji-xian-cheng-xiang-guan-xing/

Qt的事件循环机制和原生的Window消息循环机制如出一辙,不同点在于Qt将本地的消息封装成QEvent事件。同时,为了处理计时器,socket消息并且能够提前过滤事件,Qt在内部创建了隐藏窗口,通过handle找到窗口过程,进而对事件进行处理。

一、普通窗口Widget
当窗口创建的时候,会有一个窗口过程处理函数,也就是用来处理应用程序分发给该窗口的消息。
1.首先注册一个普通窗口类,这个窗口类的处理函数叫qWinProcess(),可能函数名会有点误差,我这里只是梳理总结,请大家包涵;
2.然后创建窗口,返回一个窗口句柄。
3.当鼠标点击,键盘输入等对窗口元素操作时,系统会把这个消息告诉应用程序,然后应用程序会依据窗口句柄把它分发给对应的窗口处理函数。
4.窗口处理函数会把消息转换成QEvent,然后加入窗口事件队列,暂且把它称作windowEventQueue
5.在事件循环中去处理这些事件,将事件从队列中取出,然后通知notify给对应的widget or
receiver,它们再对消息进行处理。
二、内部隐藏窗口
在QEventDispatcher类内会创建一个内部隐藏窗口,创建过程如上。目的是处理一些特殊事件和过滤事件。特殊事件比如计时器,socket等,过滤事件是指filterEvent,每个QObject类都可以设立过滤器来提前过滤消息。这需要用到getMesgHook()之类的函数,用来截取消息,就好像是谍战剧中的情报截获装置。
三、信号槽
首先,信号槽的使用不一定要用事件循环和分发器。对于队列连接,则一定是要通过事件循环去处理信号的。对于直接连接的信号槽,就像是同步代码一样运行。队列连接的原理是将信号转换成Qt事件,然后将事件放入接收者所在线程的事件队列postEventList。接着,进入事件循环,对postEventList的事件进行处理。

总结:Qt的事件机制本质上用的就是消息队列。用消息队列的好处是可以进行多线程协同处理,多个生产者,一个消费者,保证了事件处理的同步性。同时,每个线程都有自己独立的事件队列,互不干扰,但是可以跨线程通信。

Qt 事件循环机制Qt 框架的核心,它负责处理所有的事件和信号槽机制Qt 事件循环机制源码实现比较复杂,涉及到多个类和文件。下面是一个简单的 Qt 事件循环机制源码解析: 1. 事件循环机制的入口函数是 QCoreApplication::exec(),它是一个静态函数,会启动事件循环。 2. 在事件循环中,Qt 会不断地从事件队列中取出事件,然后分发给对应的对象处理。事件队列是一个双向链表,由 QEventDispatcherWin32(Windows 平台)或 QEventDispatcherUNIX(Unix/Linux 平台)管理。 3. 事件分发的过程是通过 QObject::event() 函数实现的。当一个事件分发给一个对象时,它会首先调用对象的 event() 函数,如果该函数返回 false,那么事件会被传递给对象的父对象,直到有一个对象的 event() 函数返回 true,或者事件传递到了根对象。 4. 信号槽机制的实现也依赖于事件循环机制。当一个信号被发射时,它会被转化为一个事件,然后被插入到事件队列中。当事件循环处理到该事件时,它会调用对应的槽函数。 5. 事件循环还涉及到消息循环和定时器机制消息循环通过 QSocketNotifier 和 QAbstractEventDispatcher 类实现,它可以监听文件描述符和套接字等事件。定时器机制通过 QTimer 类实现,它可以定时触发事件。 总之,Qt 事件循环机制源码实现非常复杂,但它是 Qt 框架的核心,负责处理所有的事件和信号槽机制,是 Qt 能够高效运行的关键。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值