Windows API GetMessage()和PeekMessage()的区别

  1. 消息获取方式

    • GetMessage()
      • 这个函数是一个阻塞式的消息获取函数。它会一直等待消息队列中有消息到来,当消息队列中没有消息时,线程会暂停执行(进入睡眠状态),直到有消息被放入消息队列。
      • 例如,在一个简单的 Windows 应用程序的消息循环中,GetMessage(&msg, NULL, 0, 0);会阻塞线程,直到获取到一个有效的消息(msgMSG结构,用于存储消息相关信息)。
    • PeekMessage()
      • 这是一个非阻塞式的消息获取函数。它会检查消息队列中是否有消息,如果有消息就返回TRUE并将消息存储在指定的MSG结构中;如果没有消息,它会立即返回FALSE,线程不会被阻塞,可以继续执行其他任务。
      • 例如,PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);会检查消息队列,根据是否有消息来决定是否填充msg结构。
  2. 消息处理后的行为

    • GetMessage()
      • 当获取到一个消息后,GetMessage()会根据消息的内容来决定后续操作。如果获取到的消息是WM_QUIT,它会返回FALSE,这通常会导致消息循环结束。对于其他消息,它会返回TRUE,并且消息循环可以继续处理该消息。
    • PeekMessage()
      • 因为它只是检查消息队列而不改变消息循环的执行流程(除非返回TRUE且进行了消息处理),所以即使获取到消息,也不会像GetMessage()那样自动决定是否结束消息循环。它需要在应用程序代码中根据返回值和消息内容来手动控制后续的处理流程。
  3. 消息移除方式

    • GetMessage()
      • GetMessage()返回TRUE并获取到一个消息时,它会自动将该消息从消息队列中移除。这意味着下一次调用GetMessage()时,会获取消息队列中的下一个消息。
    • PeekMessage()
      • 可以通过参数来控制是否移除消息。如果使用PM_REMOVE标志,PeekMessage()会在获取消息后将其从消息队列中移除,就像GetMessage()一样。但如果不使用这个标志,它只会检查消息的存在,而不会移除消息,这样消息仍然留在消息队列中,可以被后续的PeekMessage()GetMessage()调用获取。
  4. 应用场景

    • GetMessage()
      • 适用于传统的 Windows 消息循环,特别是在单线程的简单 Windows 应用程序中。它可以保证应用程序在没有消息时处于等待状态,有效地利用系统资源,并且按照消息到来的顺序依次处理消息。
    • PeekMessage()
      • 常用于需要在等待消息的同时执行其他后台任务的情况。例如,在一个游戏开发中,游戏循环可能会使用PeekMessage()来检查是否有系统消息(如窗口大小改变、鼠标移动等),如果有就处理这些消息,同时在没有消息时继续执行游戏的逻辑更新和渲染等任务。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值