我最近给自己买了一部新手机,运行Windows Mobile 6.1 Professional.当然,我目前正在考虑做一些编码,基于业余爱好.我的计划是将服务作为DLL运行,由Services.exe加载.这需要收集som数据,并定期(每5-10分钟)进行一次som处理.
由于我需要定期运行,因此对我来说这是一个问题,系统通常会在用户短暂不活动后进入休眠状态(暂停).
我一直在阅读我在MSDN上找到的所有文档,以及有关此主题的MSDN博客,在我看来,这个问题有三种可能的解决方案:
通过定期调用SystemIdleTimerReset将系统保持在"Always On"状态.这似乎有点过分,因此是不可能的.
让系统定期用CeRunAppAtTime唤醒,并进入无人值守状态,进行处理.
使用无人参与状态而不是进入完全暂停状态.这对用户来说是透明的,但系统永远不会进入睡眠状态.
第二种方法似乎是首选,但是,这需要系统在唤醒时调用可执行文件,唯一的任务是通知我的服务它应该开始处理.这似乎有点不必要,我想避免这个额外的可执行文件.我当然可以将我的所有处理都移到这个额外的可执行文件中,但我想使用在作为服务运行时提供的一些功能,并且在处理开始时也没有弹出程序(即使它在后台).
乍一看,第三种方法似乎与第一种方法具有相同的基本问题.但是,我已经阅读了一些MSDN博客,可能通过这种方法实际节省电池消耗,而不是经常进入和退出挂起模式(对此的论点是WM平台的性质是当系统处于空闲状态时,电池消耗非常少.进出暂停需要相当多的处理.
所以我想我的问题如下:
在我的情况下,你会推荐哪种方法?关于保持最低电池消耗,以及良好的清洁实施.
在第二种方法的情况下,是否可以消除对通知可执行文件的需求?通过替代API函数或平台上现有的通用应用程序?
在第三种方法的情况下,您是否知道与索赔相关的任何信息/统计数据,在使用无人值守模式进入暂停状态时可以延长电池寿命.例如,在首选无人值守模式之前,您需要多长时间将系统拉出挂起状态.
具体实施(奖金)问题:是否有必要定期调用SystemIdleTimerReset以保持无人值守模式?
最后,如果您认为我过早地排除了第一种方法,请告诉我原因.
请在您的回复中包括您的回答是基于知识,还是仅仅是猜测(后者也非常受欢迎!).
如果您认为我需要澄清此问题的任何部分,请发表评论.
CERunAppAtTime是一个被误解的API(很大程度上是因为名字很糟糕).它不必运行应用程序.它可以简单地设置命名系统事件(请参阅MSDN文档中的pwszAppName参数的说明).如果你想知道它何时被触发(拉动你的应用程序让设备在完成处理时再次进入休眠状态)只需要一个工作线程在同一个命名事件上执行WaitForSingleObject.
无人值守状态通常用于需要让应用程序连续运行的设备(如MP3播放器),但通过关闭背光(可能是最耗电的子系统)来节省电量.
显然无人值守模式使用的功率远远大于暂停功能,因为暂停时唯一的功耗是RAM自刷新.在无人值守模式下,处理器将由stuill供电并运行(并且几个外围设备可能也是如此 - 取决于OEM如何定义其无人值守模式).
SystemIdleTimerReset简单地阻止电源管理器因不活动而将设备置于低功耗模式.这种模式,无论是暂停,无人值守,飞行还是其他,都由OEM定义.谨慎使用它,因为当它这样做会影响设备的功耗.从用户角度来看,在无人值守模式下进行操作尤其成问题,因为他们可能认为设备已关闭(看起来那样),但现在他们的电池续航时间已经过去了.