不进队消息和进队消息

不进队消息和进队消息

不进队消息和进队消息。不进队消息是指由Windows直接调用消息处理函数,把消息直接交给其处理。而进队消息是指Windows将消息放入到程序中的消息队列中取,并通过程序中的消息循环,循环把消息取出,经过一定处理(如例子中经过translate),然后由函数DispathMessage函数将消息分发给消息处理函数处理。进队消息基本上是用户的输入:击键的消息(WM_KEYDOWN、WM_KEYUP)键盘输入产生字符(WM_CHAR)、鼠标移动(WM_MOUSEMOVE)、鼠标键(WM_LBUTTONDOWN)、计时消息(WM_TIMER)、刷新消息(WM_PAINT)和退出消息(WM_QUIT)。不进队消息则是其他消息。一般情况下,不进队消息的产生是由于调用了其他Windows函数。如,当调用CreateWindow时,Windows将创建WM_CREATE消息、当调用ShowWindow时,将产生WM_SIZE和WM_SHOWWINDOW消息、当调用UpdateWindow时创建的WM_PAINT消息(注意,并不是某个类型是进队消息就永远是进队消息,如WM_PAINT有进队的,也有不进队的)、还有其他进队消息也有可能在不进队消息中出现,整个处理过程是复杂的,但由于Windows已经解决大部分的问题,因此我们可以认为我们获得的消息是有序的、同步的。

发送消息:SendMessage 和 PostMessage,SendMessage为发送“不进队消息”,直接调用处理函数处理,返回处理函数处理结果。PostMessage为发送“进队消息”。PostThreadMessage为向线程发消息


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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值