Windows消息循环之我见

       之前对MFC的消息处理机制也不是特别明白,最近在看opengl的时候顺便了解了一下。本文纯属个人观点,说不定还是错滴,请批评性地阅读~~~

       消息循环本身就是一个死循环,但之前令我诧异的是CPU占用率为什么不是100%呢?

比如,我们在Windows Console下,写下面这段程序:

        

while(1
{
    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();
    }
}

 

        这样其实也会让CPU占用率达到100%,因为PeekMessage获取消息时不管有没有获取到消息都直接返回,所以始终在循环。

        如果改成:

 

代码
while(!done)
{
    
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, 具体我也不是很懂。

      

posted @ 2010-01-28 15:31  liuweixuan  阅读(348)  评论(0)    收藏  举报