GetMessage和DispatchMessage得详细联系
在看 Programming Role Playing Games with DirectX 一书中有下面的代码片段
while(Msg.message!=WM_QUIT)
{
if(PeekMessage(&Msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
else{}
}
{
if(PeekMessage(&Msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
else{}
}
发现建立的一个简单的窗口cpu的占有率几乎100%后来在其他介绍window api的书上有下面类似写法:
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);//进行一些键盘消息的转换
DispatchMessage(&msg);
}
//TheDispatchMessagefunctiondispatchesamessagetoawindowprocedure.
//ItistypicallyusedtodispatchamessageretrievedbytheGetMessagefunction.
{
TranslateMessage(&msg);//进行一些键盘消息的转换
DispatchMessage(&msg);
}
//TheDispatchMessagefunctiondispatchesamessagetoawindowprocedure.
//ItistypicallyusedtodispatchamessageretrievedbytheGetMessagefunction.
后来在网上查到,我总结如下:
后者是用SDK进行Windows程序设计的标准写法。
使用PeekMessage一定会使系统变慢,因为PeekMessage无论是否有消息都会返
回,因此你的程序始终在执行一个死循环,在抢先多任务系统中会使系统变慢
在win3.x这种写作时多任务系统中则会使操作系统down掉。
GetMessage检查事件队列,如果没有事件就会挂起本进程等待时间发生
DispatchMessage总是返回的,及时是空消息也要讲小许分派到窗口过程处理函数的,这样自然cpu100%了
但是Programming Role Playing Games with DirectX 一书用的是前者,不知道3D游戏里面要检测所有的包括空消息的处理么?继续研究中,哪天明白了为什么这本书里面这么写吧,高手看到了一定要给点指点
本文地址:http://www.45fan.com/dnjc/69283.html