Windows消息循环的机制是:
while(GetMessage(&msg,...))
{
TranslateMessage(&msg); //转换键盘消息
DispatchMessage(&msg); //分派消息
}
运行后,当Windows没遇到WM_CLOSE消息时,这个循环一直在运转,但这个程序所在进程所占CPU利用率却很低,只有1%-2%
但是,我自己在程序中也写了个循环:
while(1)
{
i++;
}
运行后,这个程序所在进程占用CPU却一直都很高,大概50%-90%左右,两个都是循环,而且都没跳出循环,为什么Windows的循环机制占用的CPU利用率却少得多呢?望高人指教,先谢了!

解决方案 »

  1.   

    while(1) 

    i++; 
    } 放到一个线程中, Sleep() 一下
      

  2.   

    发表一下我的看法,有不对的地方请指正!1、假如系统为每个线程每次分配20毫秒的时间片;2、每当 GetMessage 函数执行时,它检查到线程的队列消息中没有消息时,就立刻把时间片交给了系统;3、而 while(1) 则不是,它是把系统分配给它的时间片全部用了。
      

  3.   


    为了使楼主容易理解,这里举个不太恰当的例子:
    期末考试考物理,考试时间是2小时;张三一看试卷,一道题也不会做,交卷直接出去了;李四平时学习认真,不过就是脑子慢点,做了整整2个小时。
    例子不怎么恰当。关键点出在了 GetMessage 函数上,时间片来了开始运行,一发现没有要处理的消息,直接把时间片交给系统。
      

  4.   

    致zaodt :
        很感谢你的解答,不过我还有些疑惑,你说GetMessage函数在时间片来了时开始运行,一发现没有要处理的消息,直接把时间片交给系统,但是时间片交给系统以后,系统没有其它的执行任务了啊,只有这一个任务了,系统不还是把时间片给了那个循环吗?难道系统会等待分给他的时间片耗完再分配给他下一个时间片?谢谢解答!
    另外我还在想一个问题:sleep函数大概是怎样实现的啊?
      

  5.   

    http://topic.csdn.net/u/20071008/09/137168a6-e52b-4879-b087-2eb2c8640b5b.html
    http://topic.csdn.net/u/20071114/23/13bc3dc2-5336-4999-a7bf-3143075ef786.html
      

  6.   

    while(1)
    {
    i++
    }
    实际上你的程序一直仍在不断地运行,CPU并没有释放出来,所以CPU的占用率当然高。
    而while(GetMessage(&msg,...)) 
    其实是阻塞在消息队列上的,当没有消息的时候,CPU是去做其它事了,本线程其实相当于在休眠。