现在的位置: 首页 > 综合 > 正文

DispatchMessage是异步的吗

2019年03月10日 ⁄ 综合 ⁄ 共 1203字 ⁄ 字号 评论关闭

          这几天面试失败,是由于对一些知识不够深入。虽然自己对这些东西‘大致了解’,但是要进大公司,那还是远远不够滴,所以务必做到知道一些知识的原理。开写这一些博客就是这个目的。

消息循环中

While(GetMessage(&msg,NULL,0,0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}


DispatchMessage将消息分发到窗口函数中,请问:DispatchMessage是直接返回还是等待WndProc处理完毕再返回? 经过网上多方求证和自己平时调试程序的经验来看,下面给出探讨。

如果直接返回,那一定会造成冲突(几个消息一起处理了),所以我认为肯定是等待WndProc处理完毕后再返回继续取出下条指令来处理。 

还有DispatchMessage究竟干了什么呢?有没有想过点击一个按钮时,为什么其父窗口会收到WM_COMMAND消息?点击程序关闭按钮时,程序究竟做了哪些操作?其实这些都是DispatchMessage的功劳。

DispatchMessage负责:
  1、将子窗口的消息(如WM_LBUTTONUP,转换成WM_COMMAND发给父窗口) WM_COMMAND和WM_NOTIFY
2、向同一线程的不同窗口的窗口处理函数分派消息。

     再回答上面的问题就有眉目了。

当点击一个按钮松开时,会发送WM_LBUTTONUP消息,DispatchMessage根据消息的坐标位置判断其在按钮上,然后再给其父窗口发送WM_COMMAND消息(经调试得知,不是发送消息到消息队列,而是直接SendMessage到窗口消息过程。)关闭程序时过程也大体一样,但是过程更加复杂。他通过WM_NCLBUTTONUP来判断,然后进行一系列操作。

DispatchMessage到底干了什么 ?
  如果只是去调用相应的窗口,那自己写个switch不就可以了, DispatchMessage与switch不同之处在于DispatchMessage会先调用windows,进入管态(大概是range   0),然后再由windows调用窗口的函数。  
  为什么这么麻烦?  
  因为这样windows就可以知道你的程序运行到什么情况了, windows来调用你的窗口,这样你的窗口返回的时候windows就知道你已经处理过一个消息了,如果没有新的消息进入消息队列windows就不再会给你的进程分配时间片  
  如果是你自己写switch的话,windows就不可能这样灵活的分配时间资源利用率就会降低 ,那么还要消息循环干什么,windows直接把消息发给窗口不就可以了吗?  
  因为你要在消息循环里把KEY_DOWN和KEY_UP组合成WM_CHAR,还可以直接屏蔽掉许多对你来说无用的消息,加快速度 。
DispatchMessage这一套机制大概是windows里最难理解的部分了


抱歉!评论已关闭.