在前文中我们讲到,鼠标或者键盘事件产生的消息会送到操作系统的消息队列中,再从系统队列送到各线程对应的消息队列。本文主要讲述的就是系统队列以及线程队列。
1. 系统队列
当操作系统启动并初始化时,线程Raw Input Thread(RIT)就会启动,并创系统硬件输入队列(System Hardware Input Queue)(SHIQ). 对于外部的硬件事件(鼠标或者键盘),硬件驱动会将事件转换成消息,并存放到SHIQ中,而RIT线程就专门负责处理SHIQ中的消息,把消息分发到对应线程的消息队列里面。
2. 线程队列
对于每个用MFC开发的GUI程序,他们都有一个CMy***App,该类继承自CWinApp,而CWinApp继承自CWinThread, CWinApp是一个GUI线程,系统会为其维护一个THREADINFO结构,
消息队列包含在一个叫THREADINFO的结构中,有四个队列:
Sent Message Queue 发送消息队列
Posted Message Queue 登记消息队列
Visualized Input Queue 输入消息队列
Reply Message Queue 响应消息队列
Sent Message Queue 发送消息队列
Posted Message Queue 登记消息队列
Visualized Input Queue 输入消息队列
Reply Message Queue 响应消息队列
Sent Message Queue: 该队列保存其他程序通过SendMessage给该线程发送的消息
Posted Message Queue: 该队列保存其他队列通过PostMessage给该线程发送的消息
Visualized Input Queue: 保存系统队列分发过来的消息,比如鼠标或者键盘的消息
Reply Message Queue: 保存向窗体发送消息后的结果,比如sendMessage操作结束后,接收消息方会发送一个Reply消息给发送方的Reply队列中,以唤醒发送队列。
这些队列如何产生的?线程是内核对象,我们看看线程信息是如何定义的,包含哪些内容,分析如下THREADINFO结构体定义,可以得出一些信息:
图一:THREADINFO简图 (来自WINDOWS核心编程第四版)
该图中很明显的阐述了我们上文所述的四个队列,无需在赘言。
总结:
该篇文章主要分析了系统队列、线程队列有谁创建,何时创建的相关信息。
注:下文会分析GetMessage的逻辑过程,SendMessage以及PostMessage的相关信息