Peekmessage和Getmessage的区别

作者在 2008-09-21 00:01:31 发布以下内容
Peekmessage和Getmessage都是向系统的消息队列中取得消息,不过性质不同。
  若第一次向消息队列中取不到消息,则程序的主线程会被OS(操作系统)挂起;等到OS重新调度到该线程时,而且消息队列仍然是空的时,两者的性质不同:  
  若使用Getmessage(),则程序的主线程会仍被OS挂起。  
  若是用Peekmessage(),则程序会取得OS控制权,运行一段时间。此函数多用于处理系统的空闲时间。
getmessage   and   peekmessage   are     both   get   the   message   from   send_message   queue.  
getmessage   supports     同步机制。PEEKMESSAGE   SUPPORTS   异步机制。

从原因上而言:GetMessage函数从消息队列中得到消息后并在队列中删除该消息  
              PeekMessage函数从消息队列中得到消息后并不在队列中删除该消息  
从结果上而言:GetMessage等待一个消息(就像_getch),直到拿到消息才返回
              PeekMessage不是这样(就像_kbhit),查询消息队列,有就取,即使没有也立即返回。  
    
为了实现windows的多任务,要用getmessage,因为当getmessage发现自己的消息队列里没有消息时,就会把控制权交还给系统,这样就可以让避免资源的浪费。

GetMessage函数每次调用是肯定会取回一个消息的,当消息队列为空的时候此进程会被挂起直到消息队列中有消息可取为止。  
PeekMessage函数不管消息队列中是否有消息都会立即返回,返回是可以从返回的值里判断是否取到了消息,准确地说此函数是询问了一下消息队列,至于取回消息后是否从消息队列中删除此消息,由参数可以指定。  
  Windows3.1时很多应用程序的消息队列是由GetMessage函数构成的,而Win32以后大多数的应用程序的消息队列是由 PeekMessage函数构成的,vc和bcb好像都是这样的,基于Win32的抢先式多任务处理机制,采用PeekMessage函数构成的消息循环也不会对系统造成什么威胁。

经验 | 阅读 13485 次
文章评论,共0条
游客请输入验证码
浏览1936627次