如何解决移动应用中 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();
      
编写应用使其实现自行管理,如上面的伪代码所示,这有助于提高电池供电系统的电源使用。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章