5

我最近给自己买了一部新手机,运行 Windows Mobile 6.1 Professional。当然,我目前正在考虑为它做一些编码,基于爱好。我的计划是让服务作为 DLL 运行,由 Services.exe 加载。这需要收集 som 数据,并定期(每 5-10 分钟)进行 som 处理。

由于我需要定期运行它,这对我来说有点问题,系统通常会在用户短时间不活动后进入睡眠状态(挂起)。

我一直在阅读我可以在 MSDN 上找到的所有文档,以及关于这个主题的 MSDN 博客,在我看来,这个问题有三种可能的解决方案:

  1. 通过定期调用SystemIdleTimerReset将系统保持在“始终开启”状态。这似乎有点过分,因此是不可能的。

  2. 让系统定期用CeRunAppAtTime唤醒,并进入无人看管状态,以进行我的处理。

  3. 使用无人值守状态而不是进入完全挂起状态。这对用户来说是透明的,但系统永远不会进入睡眠状态。

第二种方法似乎是首选,但是,这需要系统在唤醒时调用可执行文件,唯一的任务是通知我的服务它应该开始处理。这似乎有点不必要,我想避免这个额外的可执行文件。我当然可以将所有处理转移到这个额外的可执行文件中,但是我想使用作为服务运行时提供的一些工具,并且在处理开始时也不会弹出程序(即使它在后台)。

乍一看,第三种方法似乎与第一种方法存在相同的基本问题。但是,我在一些 MSDN 博客上读到,使用这种方法实际上可以节省电池消耗,而不是经常进出挂起模式(对此的论点是 WM 平台的性质是当系统空闲时,电池消耗很少。进出挂起需要相当多的处理)。

所以我想我的问题如下:

  • 在我的情况下,您会推荐哪种方法?关于保持最小的电池消耗和一个很好的干净的实现。

  • 在方法二的情况下,是否可以消除对通知可执行文件的需要?是通过替代 API 函数,还是通过平台上现有的通用应用程序?

  • 在方法三的情况下,您是否知道与声明相关的任何信息/统计数据,当使用无人值守模式而不是进入挂起状态时,可以延长电池寿命。例如,在首选无人值守模式之前,您需要多久将系统从挂起状态中拉出来。

  • 实现特定(奖励)问题:是否有必要定期调用SystemIdleTimerReset以保持无人值守模式?

最后,如果您认为我过早地取消了方法一,请告诉我原因。


请在您的回复中包括您的回复是基于知识还是仅仅是猜测(也非常欢迎后者!)。

如果您认为我需要澄清这个问题的任何部分,请发表评论。

4

2 回答 2

6

CERunAppAtTime 是一个很容易被误解的 API(主要是因为这个可怕的名字)。它不必运行应用程序。它可以简单地设置一个命名系统事件(参见MSDN 文档中 pwszAppName 参数的描述)。如果您想知道它何时触发(在您的应用程序完成处理后让设备再次进入睡眠状态),只需有一个工作线程在同一个命名事件上执行 WaitForSingleObject 即可。

无人值守状态通常用于需要保持应用程序持续运行(如 MP3 播放器)但通过关闭背光(可能是最耗电的子系统)来节省电量的设备。

显然无人值守模式比挂起使用更多的功率,因为​​在挂起中唯一的功耗是用于 RAM 自刷新。在无人值守模式下,处理器仍处于供电和运行状态(几个外围设备也可能如此 - 取决于 OEM 如何定义其无人值守模式)。

SystemIdleTimerReset 只是防止电源管理器由于不活动而将设备置于低功耗模式。这种模式,无论是暂停、无人值守、飞行还是其他,都由 OEM 定义。谨慎使用它,因为这样做会影响设备的功耗。从用户的角度来看,在无人值守模式下执行此操作尤其成问题,因为他们可能认为设备已关闭(看起来是这样),但现在他们的电池寿命已经缩短。

于 2009-01-11T20:48:51.190 回答
1

我有一篇很长的文章详细说明了您不应该期望能够获得可接受的电池寿命,因为 WM 并非旨在支持您正在尝试做的事情,但是- 您可以在唤醒时发出服务信号,进行处理,然后使用本文中的方法立即使设备重新进入睡眠状态。通过这种方式,您应该能够将准时与睡眠时间的比率保持在非常低的水平——但正如您所说,我只是在猜测。

也可以看看:

节能应用 (MSDN)

人民的力量开发者 1开发者 2设备

节能的 WM 应用程序(博客文章)

于 2009-01-15T17:27:38.940 回答