由于许多旧应用多年来大量使用 PeekMessage 作为消息循环的关键组件,因此解决应用中的电源问题就变得尤为重要。基本上,PeekMessage 调用使系统忙于检查消息而大量占用系统。
直接控制应用中 PeekMessage 使用方式的一种方法是构建自己的消息循环。通过确保您已涵盖了 Microsoft 基本类* (MFC*) 主消息循环中的基本元素,您的应用可以直接控制消息泵。下面是兼容 MFC 的一个简短的伪代码样例:
while ( bDoingBackgroundProcessing ) { MSG msg; while ( ::PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) { if ( !PumpMessage( ) ) { bDoingBackgroundProcessing = FALSE; ::PostQuitMessage( ); break; } } // 使 MFC 进行其空闲处理 LONG lIdle = 0; while ( AfxGetApp()->OnIdle(lIdle++ ) ) ; // 在此处进行一些后台处理 // 使用另一个对 OnIdle 的调用 } |
在循环中使用 PeekMessage 的问题在于 Windows 不能进入空闲状态。节能的应用会处理所有消息并进行后台处理,然后调用 WaitMessage 以进入睡眠状态,直至出现新消息。使用 WaitMessage 可释放系统从而处理其他任务:
if (PeekMessage(...) != NULL) // 如果存在消息,则转化和调度该消息 else if (there is background processing to do) // 进行后台处理 else // 未进行任何后台处理,没有等待的消息 - 进入睡眠状态 WaitMessage(); |