【发布时间】:2010-09-30 19:19:25
【问题描述】:
我最近给自己买了一部运行 Windows Mobile 6.1 Professional 的新手机。当然,我目前正在考虑为它做一些编码,基于爱好。我的计划是让服务作为 DLL 运行,由 Services.exe 加载。这需要收集 som 数据,并定期(每 5-10 分钟)进行 som 处理。
由于我需要定期运行它,这对我来说有点问题,系统通常会在用户短时间不活动后进入睡眠(挂起)。
我一直在阅读我可以在 MSDN 上找到的所有文档,以及关于这个主题的 MSDN 博客,在我看来,这个问题有三种可能的解决方案:
通过定期调用 SystemIdleTimerReset 将系统保持在“始终开启”状态。这似乎有点过分,因此是不可能的。
让系统定期用 CeRunAppAtTime 唤醒,并进入无人值守状态,进行我的处理。
使用无人参与状态而不是进入完全挂起。这对用户来说是透明的,但系统永远不会进入睡眠状态。
第二种方法似乎更受欢迎,但是,这需要系统在唤醒时调用可执行文件,唯一的任务是通知我的服务它应该开始处理。这似乎有点不必要,我想避免这个额外的可执行文件。我当然可以将所有处理转移到这个额外的可执行文件中,但是我想使用作为服务运行时提供的一些工具,并且在处理开始时也不会弹出程序(即使它在后台)。
乍一看,第三种方法似乎与第一种方法存在相同的基本问题。但是,我在一些 MSDN 博客上读到,使用这种方法实际上可以节省电池消耗,而不是经常进出挂起模式(对此的论点是 WM 平台的性质是在系统空闲时消耗很少的电池。进入和退出挂起需要相当多的处理。
所以我想我的问题如下:
在我的情况下,您会推荐哪种方法?关于保持最低的电池消耗和一个干净的实现。
在方法二的情况下,是否可以消除对通知可执行文件的需要?是通过替代 API 函数,还是通过平台上现有的通用应用程序?
在方法三的情况下,您是否知道与声明相关的任何信息/统计数据,即在使用无人值守模式时可以延长电池寿命而不是进入挂起状态。例如。在首选无人值守模式之前,您需要多久让系统退出暂停状态。
实现特定(奖励)问题:是否有必要定期调用 SystemIdleTimerReset 以保持无人值守模式?
最后,如果您认为我过早地淘汰了方法一,请告诉我原因。
请在您的回复中注明您的回复是基于知识还是仅仅是猜测(也非常欢迎后者!)。
如果您认为我需要澄清这个问题的任何部分,请发表评论。
【问题讨论】:
-
我们在这里谈论的固定间隔是什么? 30秒? 10分钟?每隔一小时?你在收集什么样的信息?
-
感谢您的提问。我们每 5 到 10 分钟通话一次,最好尽可能经常。我认为这与问题无关,但我收集的信息主要是 GPS 坐标,我想要详细的路线路径。
标签: c++ winapi windows-mobile pocketpc