如何解決移動應用中 PeekMessage 調用的資源利用問題

挑戰
確定在基於 Windows* 的移動應用中 PeekMessage 調用對電池壽命的影響並將其降至最低。 針對電池供電設備上運行的應用,當談及其優化技術時,某些應用開發人員可能會懷疑或不理解爲何需要考慮這一問題。

由於許多舊應用多年來大量使用 PeekMessage 作爲消息循環的關鍵組件,因此解決應用中的電源問題就變得尤爲重要。基本上,PeekMessage 調用使系統忙於檢查消息而大量佔用系統。

解決方案
注意電源提示,當程序空閒時啓用適當的空閒狀態。 可以編寫應用使其更節能,允許 Windows 空閒,同時監視應用未處理消息處於空閒狀態時的大致時間長度。鑑於合理使用 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。PumpMessage 用於執行正常消息轉換和調度。使用該代碼的問題在於 PumpMessage 調用。當該源代碼可在 ThrdCore.cpp 中找到時,它未經正式歸檔,因此在以後的版本中可能會發生變化。

在循環中使用 PeekMessage 的問題在於 Windows 不能進入空閒狀態。節能的應用會處理所有消息並進行後臺處理,然後調用 WaitMessage 以進入睡眠狀態,直至出現新消息。使用 WaitMessage 可釋放系統從而處理其他任務:

if (PeekMessage(...) != NULL)
   // 如果存在消息,則轉化和調度該消息
else if (there is background processing to do)
   // 進行後臺處理
else 
   // 未進行任何後臺處理,沒有等待的消息 - 進入睡眠狀態
   WaitMessage();
      
編寫應用使其實現自行管理,如上面的僞代碼所示,這有助於提高電池供電系統的電源使用。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章