delphi 为什么在获取消息之前先看消息?

epggiuax  于 9个月前  发布在  其他
关注(0)|答案(3)|浏览(161)

为什么在创建消息队列的Getmessage()之前需要peekMessage语句?

pepwfjgg

pepwfjgg1#

这不是必须的
但是,有时候你会看到一个线程还没有准备好处理消息,但是它希望能够在它的消息队列中接收消息。新线程没有立即的消息队列,但是调用PeekMessage就足以创建消息队列。它立即返回,因为没有消息,这允许线程继续准备自己。同时,其他线程可以开始为新线程排队消息。一旦新线程准备就绪,它就会调用GetMessage来从队列中检索第一条消息,或者等待消息被放入队列。

muk1a3rh

muk1a3rh2#

不是的。这两个函数做的是不同的事情。
PeekMessage(...)不会等待消息的出现--如果消息出现,它会获取第一个消息,也可以选择将其从队列中删除,但如果没有消息,则返回false。在等待消息时进行一些处理的应用程序中更常见,不能只是坐在那里永远等待下一条消息。实时游戏等很容易属于这一类。
GetMessage(...)等待直到有消息,并获取它。它在CPU方面更有效,因为它不是不断轮询,但如果没有任何消息,它会暂停。它在我的应用程序和其他不需要持续实时处理的程序中更常见。

r1zk6ea1

r1zk6ea13#

GetMessage之前/而不是GetMessage之前使用PeekMessage有多种原因:
1.确保程序在消息到达之前不会挂起--这有点多余,因为您可以直接使用带有PM_REMOVE标志的PeekMessage来轮询消息队列,而完全省略GetMessage
1.将函数与PM_NOREMOVE一起使用,并决定是否要处理和/或从队列中删除消息。
1.在返回消息的窗口句柄上调用IsWindowUnicode,并选择PeekMessageAPeekMessageW
1.以上的倍数。

相关问题