Windows 消息循环 GetMessage() PeekMessage()

  1. GetMessage()函数的消息循环的汇编代码
    .while	TRUE
    			invoke	GetMessage,addr @stMsg,NULL,0,0
    			.break	.if eax	== 0
    			invoke	TranslateMessage,addr @stMsg
    			invoke	DispatchMessage,addr @stMsg
    		.endw
    		ret
    
    解读:
    1. 调用 GetMessage 函数,函数中都要用到一个MSG结构体,那是用来存储 消息信息 的。
    2. Windows结构体的定义都放在 windows.inc 这个文件中,我们可以从中查到 MSG的定义
      	MSG STRUCT
      	  hwnd      DWORD      ?
      	  message   DWORD      ?
      	  wParam    DWORD      ?
      	  lParam    DWORD      ?
      	  time      DWORD      ?
      	  pt        POINT      <>
      	MSG ENDS
      
      参数介绍:
      1. hwnd - 消息发送的窗口句柄。
      2. message - 消息标识符,表示何种消息。
      3. wParam - 消息参数之一。
      4. lParam - 消息参数之二。
      5. time - 消息放入消息队列的时间。
      6. pt - POINT数据结构,表示消息放入消息队列时的鼠标坐标。
    3. 理解:
      1. GetMessage()函数相当于开始拿着一个空的MSG,然后去消息队列中获取。在这里插入图片描述
      2. 当发现MSG中的消息是WM_QUIT时,则GetMessage()返回值为0,返回值保存在寄存器eax中,所以,此时,程序就会结束消息循环,也就是退出窗口过程。
      3. Windows窗口程序的本质就是 消息循环,对于 所有函数信息的处理,都遵循这一套模板,哪怕windows内置的函数也是这样的。
  2. PeekMessage()的消息循环:
    1. Windows是一个抢占式的操作系统,任务每20ms切换一次。
    2. 对于GetMessage()来讲,轮到自己的20ms时,它会读取并处理消息,但消息队列里没有属于它一份的消息,它就会停留在GetMessage函数内部,当Windows发现它这样时,Windows认为该窗口没有要处理的,此时就会剥夺它的时间,所以,GetMessage函数是程序空闲的时候主动将控制权交给Windows的一种方式。
    3. PeekMessage()与GetMessage()类似,区别时在没有消息时,它不会像GetMessage()那样在内部停留,而是直接返回,并且设置eax为0,所以,在0时,程序会检查是否是WM_QUIT。
    4. 所以,PeekMessage在没有收到消息的时候会一直循环检测,从而Windows不会剥夺该任务的时间片,也就是说,20ns的时间片内,就算没有消息,它也会一直在循环检测不会吧控制权交还给Windows程序。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值