我最近给自己买了一部新手机,运行WindowsMobile6.1Professional。当然,我目前正在为它做一些编码,这是我的业余爱好。我的计划是让服务以DLL的形式运行,由Services.exe加载。这需要收集som数据,并定期进行som处理(每5-10分钟)。
由于我需要定期运行这个程序,这对我来说是个小问题,系统通常会在用户短暂的无活动状态下进入休眠状态(暂停)。
我一直在阅读在MSDN和MSDN博客上可以找到的关于这个主题的所有文档,在我看来,解决这个问题有三种可能的解决方案:
第二种方法似乎是首选的,但是,这将需要系统在唤醒时调用一个可执行文件,唯一的任务是通知我的服务它应该开始处理。这似乎有点不必要,我想避免这个额外的可执行文件。当然,我可以将我的所有处理移到这个额外的可执行文件中,但是我想使用一些在作为服务运行时提供的工具,并且在处理开始时不会弹出一个程序(即使它在后台)。
乍一看,第三种方法似乎有着与第一种相同的基本问题。然而,我在一些MSDN博客上读到,使用这种方法可能实际上可以节省电池消耗,而不是经常进出挂起模式(其中的论点是,WM平台的本质是在系统空闲时消耗很少的电池。而进出暂停需要相当多的处理)。
所以我想我的问题如下:
最后,如果你认为我过早地排除了第一种方法,请告诉我原因。
请在你的回复中包括你的回应是基于知识,还是仅仅是猜测(后者也很受欢迎!)
如果你认为我需要澄清这个问题的任何部分,请留下评论。
发布于 2009-01-11 20:48:51
CERunAppAtTime是一个非常误解的API (主要是因为这个糟糕的名字)。它不需要运行应用程序。它可以简单地设置一个命名的系统事件(请参阅pwszAppName参数在MSDN文档中的描述)。如果你想知道它是什么时候启动的(让你的应用程序在完成处理后再让设备进入睡眠状态),只需让一个工作线程对同一个命名的事件执行一个WaitForSingleObject。
无人值守状态通常用于需要保持应用程序连续运行的设备(如MP3播放器),但通过关闭背光(可能是最耗电的子系统)来节省电源。
显然无人值守模式比挂起使用更多的功率,因为在挂起中唯一的功率图是用于RAM自刷新。在无人值守模式下,处理器是工作、供电和运行的(一些外围设备也可能也是如此--取决于OEM如何定义它们无人值守的模式)。
SystemIdleTimerReset只是防止电源管理器由于不活动而使设备进入低功耗模式。这种模式,无论是暂停,无人值守,飞行或其他,是由OEM定义的。谨慎使用它,因为当你这样做时,它会影响设备的耗电量。从用户的角度来看,在无人值守模式下这样做尤其有问题,因为他们可能会认为设备关机(看起来是这样的),但现在他们的电池寿命已经下降了。
发布于 2009-01-15 17:27:38
我发了一篇很长的文章,详细描述了你不应该期望能得到可以接受的电池寿命,因为WM不是为了支持你想要做的事情而设计的,但是--你可以在唤醒时发出信号,进行处理,然后使用这个职位中的方法使设备立即恢复休眠。你应该可以把准时睡眠时间的比率保持在很低的水平,但正如你所说的,我只是猜测。
另请参阅:
节能应用程序(MSDN)
赋予人民的权力 (开发人员1、开发人员2、设备)
高效的WM应用程序(博客文章)
https://stackoverflow.com/questions/433325
复制相似问题