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