Windows消息循环的机制是:
while(GetMessage(&msg,...))
{
TranslateMessage(&msg); //转换键盘消息
DispatchMessage(&msg); //分派消息
}
运行后,当Windows没遇到WM_CLOSE消息时,这个循环一直在运转,但这个程序所在进程所占CPU利用率却很低,只有1%-2%
但是,我自己在程序中也写了个循环:
while(1)
{
i++;
}
运行后,这个程序所在进程占用CPU却一直都很高,大概50%-90%左右,两个都是循环,而且都没跳出循环,为什么Windows的循环机制占用的CPU利用率却少得多呢?望高人指教,先谢了!
while(GetMessage(&msg,...))
{
TranslateMessage(&msg); //转换键盘消息
DispatchMessage(&msg); //分派消息
}
运行后,当Windows没遇到WM_CLOSE消息时,这个循环一直在运转,但这个程序所在进程所占CPU利用率却很低,只有1%-2%
但是,我自己在程序中也写了个循环:
while(1)
{
i++;
}
运行后,这个程序所在进程占用CPU却一直都很高,大概50%-90%左右,两个都是循环,而且都没跳出循环,为什么Windows的循环机制占用的CPU利用率却少得多呢?望高人指教,先谢了!
{
i++;
} 放到一个线程中, Sleep() 一下
为了使楼主容易理解,这里举个不太恰当的例子:
期末考试考物理,考试时间是2小时;张三一看试卷,一道题也不会做,交卷直接出去了;李四平时学习认真,不过就是脑子慢点,做了整整2个小时。
例子不怎么恰当。关键点出在了 GetMessage 函数上,时间片来了开始运行,一发现没有要处理的消息,直接把时间片交给系统。
很感谢你的解答,不过我还有些疑惑,你说GetMessage函数在时间片来了时开始运行,一发现没有要处理的消息,直接把时间片交给系统,但是时间片交给系统以后,系统没有其它的执行任务了啊,只有这一个任务了,系统不还是把时间片给了那个循环吗?难道系统会等待分给他的时间片耗完再分配给他下一个时间片?谢谢解答!
另外我还在想一个问题:sleep函数大概是怎样实现的啊?
http://topic.csdn.net/u/20071114/23/13bc3dc2-5336-4999-a7bf-3143075ef786.html
{
i++
}
实际上你的程序一直仍在不断地运行,CPU并没有释放出来,所以CPU的占用率当然高。
而while(GetMessage(&msg,...))
其实是阻塞在消息队列上的,当没有消息的时候,CPU是去做其它事了,本线程其实相当于在休眠。