如何解决移动应用中 PeekMessage 调用的资源利用问题

yanglilibaobao 2006-12-05 04:17:05
确定在基于 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();


编写应用使其实现自行管理,如上面的伪代码所示,这有助于提高电池供电系统的电源使用。
...全文
226 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我的板子是技嘉的 GA-6BXD,PCB 版本号 1.6,BIOS 更新到最新。跳线在 100MHz/5.0X,装上 2 只原装 OEM PIII500 CPU,Solt1 接口,开机能够认到 2 个 CPU,显示

INTEL 440BX CHIPSET
VCORE1=2.00V VCORE2=2.00V
INTEL PENTIUM III-MMX CPU 500MHz , 2 Processor(2)
<CPU2 ID=0636><PATCH ID=0035><CPU1 ID=0636><PATCH ID=0035>
Memory Testing... 1048576KB OK.

但是无论安装 WinNT 4.0 Win2000 Pro/Server WinXP 都不能识别 2 个 CPU,任务管理器只有 1 个,任务管理器的图表菜单中也没有每个CPU一个图表的选项。

请教这是怎么回事?

568

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧