GetMessage是不是在没有消息的情况下,进程(线程)处于阻塞状态?

qiuzhizhe 2007-10-08 09:39:19
在WinMain函数中的消息循环中:
wile(GetMessage(&msg, NULL, 0, 0)) {...}
这里有两个问题:
1、WinMain中的GetMessage是从操作系统中的消息队列来获取消息的。那么如果这个消息循环是在某个子线程中的,那么GetMessage又是从什么地方来获取消息的呢?
注:我知道可以通过PostThreadMessage(ThreadId, WM_×××, NULL, NULL)来往线程中发消息,但是我相知道的是这个消息是发到操作系统的消息队列吗?

2、如题,因为这里的消息循环在得到WM_QUIT前是个死循环,如果GetMessage在没有消息时也一直运行,那么是不是很耗资源吗?所以我认为在没有资源时应该处于阻塞状态。

3、哪位兄弟手上有详细的消息对象的数据结构不妨拿出来共享一下^_^,俺手上的这本书不巧没有消息的数据结构的详细介绍。
...全文
1667 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
mihi1978 2010-12-31
  • 打赏
  • 举报
回复
强帖学习!!
qingdou 2008-08-22
  • 打赏
  • 举报
回复 1
消息循环的语句如下:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
其中,GetMessage如果收到非WM_QUIT的消息,会返回非0值;如果收到WM_QUIT消息,会返回0值。另外,GetMessage在没有消息时是阻塞的,也就是不返回,线程被操作系统挂起。
WizardK 2007-10-10
  • 打赏
  • 举报
回复 5
GET、PEEK、SEND、POST消息很好理解

GET就是不GET到不罢休
PEEK只是看看有没有消息,有就拿,没有就走人
SEND是要一直等到对方收到了才放心
POST只是把消息放在邮筒里就不管走人了
jpinglove 2007-10-10
  • 打赏
  • 举报
回复
学习一下!
abomber2 2007-10-08
  • 打赏
  • 举报
回复
是的
wltg2001 2007-10-08
  • 打赏
  • 举报
回复
各种消息(包括用户定义的消息)在系统内排队,每个程序只是负责消费它,就是说,我用的时候,我就Get,不用它,就不Get。。。。

哪来的阻塞?
=======================
这样说不对,用的时候就Get,不用时就不Get,这根本不可能,GetMessage在没有消息时是阻塞的,也就是不返回,线程停在GetMessage处,另一个PeekMessage和它不同,它是没有消息时也返回,以前有人利用这个函数在程序空闲时作一些工作。
wltg2001 2007-10-08
  • 打赏
  • 举报
回复
各种消息(包括用户定义的消息)在系统内排队,每个程序只是负责消费它,就是说,我用的时候,我就Get,不用它,就不Get。。。。

哪来的阻塞?
=======================
这样说不对,用的时候就Get,不用时就不Get,这根本不可能,GetMessage在没有消息时是阻塞的,也就是不返回,线程停在GetMessage处,另一个PeekMessage和它不同,它是没有消息时也返回,以前有人利用这个函数在程序空闲时作一些工作。
shenyi0106 2007-10-08
  • 打赏
  • 举报
回复
无论哪本介绍MFC的书籍,都有说到过这个问题,GetMessage函数在没有消息时的确是阻塞的,不消耗CPU,这是书上明确说明的。
你可以用SDK的方式写个程序测试一下,不难,网上很多
arong1234 2007-10-08
  • 打赏
  • 举报
回复
对你得问题:
1、GetMessage从当前线程消息队列,而不是所谓得操作系统队列获得
2、没有资源时处于阻塞状态,不需要消耗资源。这里3楼得理解可能有点问题

3、不建议看其所谓得消息结构,对你毫无意义,看windows核心编程也许不错
yubsh 2007-10-08
  • 打赏
  • 举报
回复
2,WM_QUIT是请求应用程序退出的消息,对系统来讲,它与其他消息没有什么不同。你提的阻塞,感觉很可怕。不太明确你说的阻塞是什么意思。个人认为,你使用这个词是错误的。

各种消息(包括用户定义的消息)在系统内排队,每个程序只是负责消费它,就是说,我用的时候,我就Get,不用它,就不Get。。。。

哪来的阻塞?

3,看MSDN,这是最好的书。


vocanicy 2007-10-08
  • 打赏
  • 举报
回复
1、每个线程都有自己的消息队列。GetMessage是从当前线程的消息队列中取消息。PostThreadMessage是发送到线程的消息队列中。

2、你的猜想是正确的。消息队列中没有消息GetMessage是不会返回的。和GetMessage不同,PeekMessage是不阻塞,立即返回。

3、《Windows核心编程》书中有详细介绍,这本书有电子版的。
acinonyx 2007-10-08
  • 打赏
  • 举报
回复
The GetMessage function retrieves a message from the calling thread's message queue. The function dispatches incoming sent messages until a posted message is available for retrieval.

Unlike GetMessage, the PeekMessage function does not wait for a message to be posted before returning.
arong1234 2007-10-08
  • 打赏
  • 举报
回复
我看到的所有的情况,都是循环GetMessage的,“不用时不get”,怎么实现呢?消息循环对线程至关重要,所有基于消息的线程都有义务随时monitor消息,不能等到特定时候再get(怎么等待呢?)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧