消息队列与消息循环

       作为windows编程的开篇,我们首先要说一说消息队列与消息循坏机制。之所以把它们放在第一篇来讨论,是因为消息队列与消息循环机制是windows编程的基础,如果不能很好的理这种机制,恐怕会在编程的时候会遇到很多困惑。好了,废话也不多说了,我们开始今天的话题吧。

        在讨论消息队列与消息循环机制以前,我们首先要了解什么是消息,消息有什么作用?事实上在windows通信中,几乎处处用到消息,比如当你想让一个按钮执行某个动作,你必须传递消息给他。windows通过一系列的事件,如:键盘敲击事件、鼠标点击事件等产生消息,产生消息之后,在将消息传递给某个窗口或接收者,窗口或接收者接收到消息后执行相应的动作。对于每个windows消息一般有两个参数一个wparam,一个是lparam,两个参数根据不同的消息代表不同的意思,windows中定义了HIWORD和LOWORD两个宏来解析他们的高低位。我们可以用PostMessage和SendMessage两个函数来对窗口或接收者发送消息,前者发送完消息后直接返回,后者要等到消息被处理完之后才会返回,也就是说PostMessage调用返回后,有可能消息并未处理完。这些是有关消息的基本内容,好了,既然了解了消息,就讨论一下消息队列与消息循环吧。

       那么什么是消息队列?其实消息队列很简单,从字面意思上理解就是存有消息的的队列,而队列的特点是先进先出。那么windows为什么会使用消息队列呢?我们想一种很简单的场景,假如我们正在使用有关键盘敲击的消息,这时候我突然点击鼠标,也就是产生了另一种消息,那么我们怎么处理,是将正在操作的消息进行移除,还是将新增的消息直接忽略?windows给我们的解决方案是将新产生的消息放入到消息队列队尾,之后每处理一个消息就将消息从消息队列的队头移除,然后依次进行处理,这样当有了新的消息之后既保证了旧的消息可以继续执行也保证了新的消息也可以不被忽略。

       与消息队列的概念对应,消息循环更简单了一步,从外形上是如下所示的循环体,这个循环在windows里非常经典,我希望我可以记住它。

    while(GetMessage(&Msg, NULL, 0, 0) > 0) 
   { 
      TranslateMessage(&Msg); 
      DispatchMessage(&Msg); 
   } 

正如我们看到的,消息循环通过GetMessage函数从消息队列中取出消息进行处理,如果函数的返回值大于零,则说明有消息需要被处理,如果小于零,则消息队列为空,程序停止进行阻塞。TranslateMessage函数是做一些额外的处理,即将虚拟键值信息转换为字符信息,这部分是可选的,有些可以忽略此函数的处理。DispatchMessage将消息分发给目的窗口,并且查找窗口过程函数,给窗口过程函数传递窗口句柄、消息、wParam、lParam等参数。然后在窗口根据消息的不同执行相应的操作,当然,DefWindowProc默认处理函数的添加一般是需要的,如果不对消息做特殊处理,可以选择添加此函数进行返回。窗口过程函数执行完之后,DispatchMessage函数返回,接着从消息队列中取出下一个消息进行处理。

       以上就是消息队列与消息循环的全部了,内容不多,由于水平有限,难免有疏漏错误之处,还希望大家多多指正。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值