Windows消息循环之我见
之前对MFC的消息处理机制也不是特别明白,最近在看opengl的时候顺便了解了一下。本文纯属个人观点,说不定还是错滴,请批评性地阅读~~~
消息循环本身就是一个死循环,但之前令我诧异的是CPU占用率为什么不是100%呢?
比如,我们在Windows Console下,写下面这段程序:
while(1)
{
dosomething();
}
{
dosomething();
}
这样CPU占用率一定是100%
但是,我们再看看消息处理的一般模型:
代码
while(!done)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if(msg.message==WM_QUIT)
done=true;
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else
{
dosomething();
}
}
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if(msg.message==WM_QUIT)
done=true;
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else
{
dosomething();
}
}
这样其实也会让CPU占用率达到100%,因为PeekMessage获取消息时不管有没有获取到消息都直接返回,所以始终在循环。
如果改成:
代码
while(!done)
{
if(GetMessage(&msg,NULL,0,0))
{
if(msg.message==WM_QUIT)
done=true;
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
{
if(GetMessage(&msg,NULL,0,0))
{
if(msg.message==WM_QUIT)
done=true;
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
由于GetMessage获取不到消息的时候并不会直接返回,而是在等待,将CPU时间交给windows,于是CPU可以先去做其他事情,所以CPU占用率不但不会达到100%,而且很小。
问题似乎解决了,但是当我发现有几个opengl的基本框架也是用PeekMessage,但是CPU占用率却很小,又有点困惑了。原来是dosomething()函数中有用到SwapBuffers, 据说里面也有等待,于是会将时间片交给windows(具体看下篇转载的文章)
另外MFC的消息循环,同时采用了PeekMessage 和GetMessage, 具体我也不是很懂。

浙公网安备 33010602011771号