为什么要在 getmessage 之前先 peekmessage?
-
27-09-2019 - |
题
为什么在Getmessage()之前需要使用peekMessage语句来创建消息队列?
解决方案
它不是必需的。
什么你有时会看到,虽然是一个线程没有准备好处理消息还没有,但希望能够得到他们的消息队列。新线程没有消息队列向右走,但调用PeekMessage
足以创建消息队列。因为没有消息,并允许线程继续让自己准备立即返回。在此期间,其他线程可以开始新线程排队的消息。一旦新的线程准备,它调用GetMessage
要么检索所述第一消息从队列,或等待要被放置到队列中的消息。
其他提示
这不是。这两个函数做不同的事情。
的PeekMessage(...)不等待出现一个消息 - 它获得的第一个,如果它的存在,任选地从队列中移除它为好,但返回false立即没有一个。这是在你做了一些处理,同时等待消息的应用越来越普遍,而不能只是坐在那里,永远等待下一条消息。实时游戏和这样容易就属于这一类。
的GetMessage(...)等待直到有一个消息,并得到它。这是更有效的CPUwise,因为它不是不断投票,但如果没有任何消息就会暂停。它多见于formy应用程序和不需要不断的实时处理其他程序是怎么回事。
使用的原因有多种 PeekMessage
之前/而不是 GetMessage
:
- 确保程序不会挂起直到消息到达 - 这有点多余,因为你可以直接使用
PeekMessage
与PM_REMOVE
轮询消息队列并忽略的标志GetMessage
共。 - 使用该函数
PM_NOREMOVE
并决定是否要处理消息和/或从队列中删除消息。 - 呼唤
IsWindowUnicode
在返回消息的窗口句柄上并选择PeekMessageA
或者PeekMessageW
. - 以上的倍数。
不隶属于 StackOverflow