在前文中我们讲到,鼠标或者键盘事件产生的消息会送到操作系统的消息队列中,再从系统队列送到各线程对应的消息队列。本文主要讲述的就是系统队列以及线程队列。
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: 该队列保存其他程序通过SendMessage给该线程发送的消息
Posted Message Queue: 该队列保存其他队列通过PostMessage给该线程发送的消息
Visualized Input Queue: 保存系统队列分发过来的消息,比如鼠标或者键盘的消息
Reply Message Queue: 保存向窗体发送消息后的结果,比如sendMessage操作结束后,接收消息方会发送一个Reply消息给发送方的Reply队列中,以唤醒发送队列。
这些队列如何产生的?线程是内核对象,我们看看线程信息是如何定义的,包含哪些内容,分析如下THREADINFO结构体定义,可以得出一些信息:
该图中很明显的阐述了我们上文所述的四个队列,无需在赘言。
总结:
该篇文章主要分析了系统队列、线程队列有谁创建,何时创建的相关信息。
参考:《WINDOWS核心编程 第四版》26章
http://blog.csdn.net/ljfth/article/details/6399237(对队列信息的描述)
注:下文会分析GetMessage的逻辑过程,SendMessage以及PostMessage的相关信息