在PocketPC上运行后台服务

时间:2009-01-11 18:03:37

标签: c++ winapi windows-mobile pocketpc

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

由于我需要定期运行,因此对我来说这是一个问题,系统通常会在用户短暂不活动后进入休眠状态(暂停)。

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

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

  2. 让系统定期用 CeRunAppAtTime 唤醒,并进入无人值守状态,进行处理。

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

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

    乍一看,第三种方法似乎与第一种方法具有相同的基本问题。但是,我已经阅读了一些MSDN博客,通过这种方法可以实际节省电池消耗,而不是经常进入和退出挂起模式(对此的论点是WM平台的性质是当系统处于空闲状态时,电池消耗非常少。进出停止需要相当多的处理。)

    所以我想我的问题如下:

    • 在我的情况下,您会推荐哪种方法?关于保持最低电池消耗和良好的清洁实施。

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

    • 在第三种方法的情况下,您是否知道与索赔相关的任何信息/统计数据,在使用无人值守模式进入暂停状态时可以延长电池寿命。例如。在首选无人值守模式之前,您需要经常将系统拉出挂起状态。

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

    最后,如果您认为我过早地排除了第一种方法,请告诉我原因。


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

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

2 个答案:

答案 0 :(得分:6)

CERunAppAtTime是一个被误解的API(很大程度上是因为名字很糟糕)。它必须运行应用程序。它可以简单地设置命名系统事件(请参阅pwszAppName参数in the MSDN docs的说明)。如果你想知道它什么时候被触发(拉动你的应用程序让设备在完成处理时再次进入休眠状态),只需要一个工作线程在同一个命名事件上执行WaitForSingleObject。

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

显然,无人值守模式使用的功率远远大于暂停功能,因为在暂停时,唯一的功耗是RAM自刷新。在无人值守模式下,处理器已经过运行并且正在运行(并且几个外围设备可能也是如此 - 取决于OEM如何定义其无人值守模式)。

SystemIdleTimerReset简单地阻止电源管理器因不活动而将设备置于低功耗模式。这种模式,无论是暂停,无人值守,飞行还是其他,都由OEM定义。谨慎使用它,因为当它这样做会影响设备的功耗。从用户的角度来看,在无人值守模式下进行操作尤其成问题,因为他们可能认为设备处于关闭状态(看起来就是这样),但现在他们的电池续航时间已经过去了。

答案 1 :(得分:1)

我有一篇很长的帖子详细说明你不应该期望能够获得可接受的电池续航时间,因为WM不是为了支持你想要做的事情而设计的,但是 - 你可以在唤醒时发出服务信号,进行处理,然后使用this post中的方法立即让设备重新进入睡眠状态。你应该能够以这种方式保持准时与睡眠时间的比例 - 但正如你所说,我只是在猜测。

另见:

Power-Efficient Apps (MSDN)

Power To The PeopleDevelopers 1Developers 2Devices

Power-Efficient WM Apps (blog post)