由於許多舊應用多年來大量使用 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(); |