当前位置:  开发笔记 > 编程语言 > 正文

在PocketPC上运行后台服务

如何解决《在PocketPC上运行后台服务》经验,为你挑选了1个好方法。

我最近给自己买了一部新手机,运行Windows Mobile 6.1 Professional.当然,我目前正在考虑做一些编码,基于业余爱好.我的计划是将服务作为DLL运行,由Services.exe加载.这需要收集som数据,并定期(每5-10分钟)进行一次som处理.

由于我需要定期运行,因此对我来说这是一个问题,系统通常会在用户短暂不活动后进入休眠状态(暂停).

我一直在阅读我在MSDN上找到的所有文档,以及有关此主题的MSDN博客,在我看来,这个问题有三种可能的解决方案:

    通过定期调用SystemIdleTimerReset将系统保持在"Always On"状态.这似乎有点过分,因此是不可能的.

    让系统定期用CeRunAppAtTime唤醒,并进入无人值守状态,进行处理.

    使用无人参与状态而不是进入完全暂停状态.这对用户来说是透明的,但系统永远不会进入睡眠状态.

第二种方法似乎是首选,但是,这需要系统在唤醒时调用可执行文件,唯一的任务是通知我的服务它应该开始处理.这似乎有点不必要,我想避免这个额外的可执行文件.我当然可以将我的所有处理都移到这个额外的可执行文件中,但我想使用在作为服务运行时提供的一些功能,并且在处理开始时也没有弹出程序(即使它在后台).

乍一看,第三种方法似乎与第一种方法具有相同的基本问题.但是,我已经阅读了一些MSDN博客,可能通过这种方法实际节省电池消耗,而不是经常进入和退出挂起模式(对此的论点是WM平台的性质是当系统处于空闲状态时,电池消耗非常少.进出暂停需要相当多的处理.

所以我想我的问题如下:

在我的情况下,你会推荐哪种方法?关于保持最低电池消耗,以及良好的清洁实施.

在第二种方法的情况下,是否可以消除对通知可执行文件的需求?通过替代API函数或平台上现有的通用应用程序?

在第三种方法的情况下,您是否知道与索赔相关的任何信息/统计数据,在使用无人值守模式进入暂停状态时可以延长电池寿命.例如,在首选无人值守模式之前,您需要多长时间将系统拉出挂起状态.

具体实施(奖金)问题:是否有必要定期调用SystemIdleTimerReset以保持无人值守模式?

最后,如果您认为我过早地排除了第一种方法,请告诉我原因.


请在您的回复中包括您的回答是基于知识,还是仅仅是猜测(后者也非常受欢迎!).

如果您认为我需要澄清此问题的任何部分,请发表评论.



1> ctacke..:

CERunAppAtTime是一个被误解的API(很大程度上是因为名字很糟糕).它不必运行应用程序.它可以简单地设置命名系统事件(请参阅MSDN文档中的pwszAppName参数的说明).如果你想知道它何时被触发(拉动你的应用程序让设备在完成处理时再次进入休眠状态)只需要一个工作线程在同一个命名事件上执行WaitForSingleObject.

无人值守状态通常用于需要让应用程序连续运行的设备(如MP3播放器),但通过关闭背光(可能是最耗电的子系统)来节省电量.

显然无人值守模式使用的功率远远大于暂停功能,因为暂停时唯一的功耗是RAM自刷新.在无人值守模式下,处理器将由stuill供电并运行(并且几个外围设备可能也是如此 - 取决于OEM如何定义其无人值守模式).

SystemIdleTimerReset简单地阻止电源管理器因不活动而将设备置于低功耗模式.这种模式,无论是暂停,无人值守,飞行还是其他,都由OEM定义.谨慎使用它,因为当它这样做会影响设备的功耗.从用户角度来看,在无人值守模式下进行操作尤其成问题,因为他们可能认为设备已关闭(看起来那样),但现在他们的电池续航时间已经过去了.

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有