为什么在创建消息队列的Getmessage()之前需要peekMessage语句?
pepwfjgg1#
这不是必须的但是,有时候你会看到一个线程还没有准备好处理消息,但是它希望能够在它的消息队列中接收消息。新线程没有立即的消息队列,但是调用PeekMessage就足以创建消息队列。它立即返回,因为没有消息,这允许线程继续准备自己。同时,其他线程可以开始为新线程排队消息。一旦新线程准备就绪,它就会调用GetMessage来从队列中检索第一条消息,或者等待消息被放入队列。
PeekMessage
GetMessage
muk1a3rh2#
不是的。这两个函数做的是不同的事情。PeekMessage(...)不会等待消息的出现--如果消息出现,它会获取第一个消息,也可以选择将其从队列中删除,但如果没有消息,则返回false。在等待消息时进行一些处理的应用程序中更常见,不能只是坐在那里永远等待下一条消息。实时游戏等很容易属于这一类。GetMessage(...)等待直到有消息,并获取它。它在CPU方面更有效,因为它不是不断轮询,但如果没有任何消息,它会暂停。它在我的应用程序和其他不需要持续实时处理的程序中更常见。
r1zk6ea13#
在GetMessage之前/而不是GetMessage之前使用PeekMessage有多种原因:1.确保程序在消息到达之前不会挂起--这有点多余,因为您可以直接使用带有PM_REMOVE标志的PeekMessage来轮询消息队列,而完全省略GetMessage。1.将函数与PM_NOREMOVE一起使用,并决定是否要处理和/或从队列中删除消息。1.在返回消息的窗口句柄上调用IsWindowUnicode,并选择PeekMessageA或PeekMessageW。1.以上的倍数。
PM_REMOVE
PM_NOREMOVE
IsWindowUnicode
PeekMessageA
PeekMessageW
3条答案
按热度按时间pepwfjgg1#
这不是必须的
但是,有时候你会看到一个线程还没有准备好处理消息,但是它希望能够在它的消息队列中接收消息。新线程没有立即的消息队列,但是调用
PeekMessage
就足以创建消息队列。它立即返回,因为没有消息,这允许线程继续准备自己。同时,其他线程可以开始为新线程排队消息。一旦新线程准备就绪,它就会调用GetMessage
来从队列中检索第一条消息,或者等待消息被放入队列。muk1a3rh2#
不是的。这两个函数做的是不同的事情。
PeekMessage(...)不会等待消息的出现--如果消息出现,它会获取第一个消息,也可以选择将其从队列中删除,但如果没有消息,则返回false。在等待消息时进行一些处理的应用程序中更常见,不能只是坐在那里永远等待下一条消息。实时游戏等很容易属于这一类。
GetMessage(...)等待直到有消息,并获取它。它在CPU方面更有效,因为它不是不断轮询,但如果没有任何消息,它会暂停。它在我的应用程序和其他不需要持续实时处理的程序中更常见。
r1zk6ea13#
在
GetMessage
之前/而不是GetMessage
之前使用PeekMessage
有多种原因:1.确保程序在消息到达之前不会挂起--这有点多余,因为您可以直接使用带有
PM_REMOVE
标志的PeekMessage
来轮询消息队列,而完全省略GetMessage
。1.将函数与
PM_NOREMOVE
一起使用,并决定是否要处理和/或从队列中删除消息。1.在返回消息的窗口句柄上调用
IsWindowUnicode
,并选择PeekMessageA
或PeekMessageW
。1.以上的倍数。