WINDOWS程序的事件驱动特性——核心是消息

    消息分为进队消息消息和非进队消息。所谓进队消息就是windows将消息发送到每个线程所专有的队列中,然后由程序自主处理,这种消息基本上是由用户输 入产生(wm_keydown,wm_keyup,wm_char,wm_mouse**,以及wm_paint,wm_timer,wm_quit)或 者是调用postmessage,postthreadmessage产生的消息;所谓的非进队消息就是直接发送给窗口过程的消息,就是直接调用窗口过 程,上述消息以外的一般都是这种类型!

    一个线程一旦建立了至少一个窗口,则系统就为其分配一个消息队列。主要表现形式为系统为其分配一个THREADINFO结构,该结构有四个指针分别指向登 记消息队列,发送消息队列,应答消息队列和虚拟输入队列。如果想将消息放入登记消息队列,可以调用postmessage,或者 postthreadmessage。其余的消息队列主要用于处理如下的事务。当某线程调用sendmessage给别的线程创建的窗口时,发送的消息首 先追加到接收线程的发送消息队列,发送线程处于空闲状态,等待接收线程处理完他的消息返回给发送线程的应答队列,等到后发送线程被唤醒取得应答队列的消息 (就是处理完消息的返回值),继续执行。而虚拟输入队列则是由windows的系统线程RIT(原始输入线程)负责将硬件事件转换成消息添加到对应线程的 虚拟消息队列中。

    处理消息队列的顺序。首先windows绝对不是按队列先进先出的次序来处理的,而是有一定优先级的。优先级通过消息队列的状态标志来实现的。首先最高优 先级的是别的线程发过来的消息(通过sendmessage),其次是处理登记消息队列消息,再次处理QS_QUIT标志,再处理虚拟输入队列,再处理 wm_paint最后是wm_timer!

你可能感兴趣的:(WINDOWS程序的事件驱动特性——核心是消息)