我最近给自己买了一部新手机,运行 Windows Mobile 6.1 Professional。当然,出于爱好,我目前正在考虑为其编写一些代码。我的计划是让一个服务作为 DLL 运行,由 Services.exe 加载。这需要收集一些数据,并定期(每 5-10 分钟)进行一些处理。
由于我需要定期运行它,这对我来说有点问题,系统通常会在用户短暂不活动后进入睡眠(挂起)状态。
我一直在阅读 MSDN 上可以找到的所有文档以及有关此主题的 MSDN 博客,在我看来,此问题有三种可能的解决方案:
通过调用使系统保持“始终开启”状态系统空闲计时器重置定期。这似乎有点过分,因此是不可能的。
让系统定期唤醒CeRunAppAtTime,并进入无人值守状态,进行我的处理。
使用无人值守状态而不是进入完全挂起状态。这对用户来说是透明的,但系统永远不会进入睡眠状态。
第二种方法似乎是首选,但是,这需要系统在唤醒时调用可执行文件,唯一的任务是通知我的服务它应该开始处理。这似乎有点不必要,我想避免这个额外的可执行文件。我当然可以将所有处理移到这个额外的可执行文件中,但我想使用作为服务运行时提供的一些设施,并且每当处理开始时也不会弹出程序(即使它在后台)。
乍一看,第三种方法似乎与第一种方法具有相同的基本问题。然而,我在一些 MSDN 博客上读到,通过这种方法实际上可以节省电池消耗,而不是经常进入和退出挂起模式(对此的论点是 WM 平台的本质是当系统空闲时,电池消耗非常少。并且进入和退出挂起需要相当多的处理)。
所以我想我的问题如下:
对于我的情况,您会推荐哪种方法?关于保持最低电池消耗和良好干净的实施。
在第二种方法的情况下,是否可以消除对通知可执行文件的需要?是通过替代 API 函数,还是平台上现有的通用应用程序?
在第三种方法的情况下,您是否知道与该声明相关的任何信息/统计数据,即使用无人值守模式而不是进入挂起状态时可以延长电池寿命。例如。在首选无人值守模式之前,您需要多久使系统脱离挂起状态。
实施特定(奖励)问题:是否有必要定期致电系统空闲计时器重置保持无人值守模式?
最后,如果您认为我过早地消除了第一种方法,请告诉我原因。
请在您的回复中注明您的回复是基于知识还是仅仅是猜测(也非常欢迎后者!)。
如果您认为我需要澄清这个问题的任何部分,请发表评论。
CERunAppAtTime 是一个经常被误解的 API(主要是因为名字很糟糕)。它doesn't必须运行一个应用程序。它可以简单地设置一个命名的系统事件(参见pwszAppName参数的描述在 MSDN 文档中 http://msdn.microsoft.com/en-us/library/aa932775.aspx)。如果您想知道它何时触发(以便您的应用程序在处理完成后再次将设备置于睡眠状态),只需有一个工作线程在同一命名事件上执行 WaitForSingleObject 即可。
无人值守状态通常用于需要保持应用程序连续运行(例如 MP3 播放器)但通过关闭背光(可能是最耗电的子系统)来节省电量的设备。
显然,无人值守模式比挂起模式使用更多的电量,因为在挂起模式下,唯一的功耗是 RAM 自刷新。在无人值守模式下,处理器仍然供电并运行(一些外设也可能如此 - 取决于 OEM 如何定义其无人值守模式)。
SystemIdleTimerReset 只是防止电源管理器因不活动而将设备置于低功耗模式。这种模式,无论是暂停、无人值守、飞行还是其他,都是由 OEM 定义的。请谨慎使用它,因为这样做会影响设备的功耗。从用户的角度来看,在无人值守模式下执行此操作尤其成问题,因为他们可能认为设备已关闭(看起来是这样),但现在他们的电池寿命已经缩短。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)