【问题标题】:Running background services on a PocketPC在 PocketPC 上运行后台服务
【发布时间】:2010-09-30 19:19:25
【问题描述】:

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

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

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

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

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

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

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

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

所以我想我的问题如下:

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

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

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

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

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


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

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

【问题讨论】:

  • 我们在这里谈论的固定间隔是什么? 30秒? 10分钟?每隔一小时?你在收集什么样的信息?
  • 感谢您的提问。我们每 5 到 10 分钟通话一次,最好尽可能经常。我认为这与问题无关,但我收集的信息主要是 GPS 坐标,我想要详细的路线路径。

标签: c++ winapi windows-mobile pocketpc


【解决方案1】:

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

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

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

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

【讨论】:

  • 非常感谢您的回答!我一直在查看 CeRunAppAtTime 的 MSDN 文档,它对 pwszAppName 参数的详细说明与 CeRunAppAtEvent 不同。这正是我需要的!
  • 也许你也可以回答我的额外问题(或者已经回答了?),是否正确理解,我需要在处理时(在无人值守模式下)定期发出 SystemIdleTimerReset 信号,以保持系统从睡眠中?还是会等到我发出 PowerPolicyNotify(PPN_UNATTENDEDMODE, FALSE) 信号?
【解决方案2】:

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

另见:

Power-Efficient Apps (MSDN)

Power To The People (Developers 1, Developers 2, Devices)

Power-Efficient WM Apps (blog post)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 2014-04-11
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多