c++ - 在 PocketPC 上运行后台服务

标签 c++ winapi windows-mobile pocketpc

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

由于我需要定期运行此程序,这对我来说有点麻烦,因为系统通常会在用户短时间不活动后进入休眠(挂起)状态。

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

  1. 通过定期调用 SystemIdleTimerReset 使系统保持“始终在线”状态。这似乎有点过分,因此是不可能的。

  2. 让系统通过CeRunAppAtTime周期性唤醒,进入无人值守状态,做我的处理。

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

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

乍一看,第三种方法似乎与第一种方法存在相同的基本问题。然而,我在一些 MSDN 博客上读到,使用这种方法实际上可以节省电池消耗,而不是经常进入和退出挂起模式(对此的争论是 WM 平台的本质是当系统空闲时,电池消耗非常少。进入和退出挂起需要相当多的处理)。

所以我想我的问题如下:

  • 在我的情况下,您会推荐哪种方法?关于保持最低电池消耗和良好的清洁实现。

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

  • 对于第三种方法,您是否知道与声明相关的任何信息/统计数据,即使用无人值守模式而不是进入挂起状态可以延长电池生命周期。例如。在首选无人值守模式之前,您需要多长时间将系统从挂起状态拉出。

  • 实现特定(奖励)问题:是否有必要定期调用 SystemIdleTimerReset 以保持无人值守模式?

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


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

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

最佳答案

CERunAppAtTime 是一个容易被误解的 API(主要是因为名字很糟糕)。它不必运行应用程序。它可以简单地设置一个命名的系统事件(参见 pwszAppName 参数的描述 in the MSDN docs )。如果您想知道它何时触发(为了让您的应用程序在完成处理后让设备再次进入休眠状态),只需让一个工作线程在同一个命名事件上执行 WaitForSingleObject。

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

显然,无人值守模式比挂起模式使用的电量要多得多,因为在挂起模式下,唯一的功耗是用于 RAM self 刷新。在无人值守模式下,处理器仍处于供电状态并正在运行(多个外围设备也可能如此 - 取决于 OEM 如何定义其无人值守模式)。

SystemIdleTimerReset 只是防止电源管理器由于不活动而将设备置于低功耗模式。这种模式,无论是暂停、无人值守、飞行还是其他,都是由 OEM 定义的。谨慎使用它,因为这样做会影响设备的功耗。从用户的角度来看,在无人值守模式下执行此操作尤其有问题,因为他们可能认为设备已关闭(看起来是那样),但现在他们的电池生命周期已经耗尽。

关于c++ - 在 PocketPC 上运行后台服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/433325/

相关文章:

java - 在构造函数中调用虚方法 : difference between Java and C++

c++ - 如何使用 Win32 消除 C++ 中原始音频信号中的随机不连续性?

C# 移动扫描仪值表现得很奇怪

c++ - 将迭代器取消引用到指针

C++:标识符规则不起作用

C#:获取设备实例句柄时出错

c++ - ShellExecuteEx 引导路径

.net - 对于 .net 开发人员来说,进入移动开发的学习曲线是怎样的?

java - java 的远程 api

c++使用memcpy在数组内复制