如何解决移动应用中 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();
编写应用使其实现自行管理,如上面的伪代码所示,这有助于提高电池供电系统的电源使用。