我们看到Windows Mobile上的应用程序偶尔会丢失数据,我们怀疑在设备挂起时某些缓冲数据没有刷新到磁盘。我们希望在设备即将暂停时手动将数据刷新到磁盘。在Windows上,我们通过捕获WM_POWERBROADCAST
消息来执行此操作,但此消息在Windows Mobile上不可用。我在a message board上发现了两年前的一句话:
你需要意识到你*不保证在你再次醒来之前你会被告知暂停*。也就是说,在设备重新唤醒之前,您可能不会收到通知。一般情况下,你不应该因为这种限制而试图做出暂停的反应(并且无论如何都要限制你对事件做出的反应)。
对于所有设备,这仍然是真的吗?我们有办法做到这一点吗?
答案 0 :(得分:3)
据我所知,您无法检测设备何时进入挂起模式,只有在设备进入CeRunAppAtEvent时才会检测到。
解决此问题的更好方法是尝试阻止设备暂停代码的关键部分。
根据应用程序的运行方式,有两种方法可以执行此操作。如果它作为用户交互的一部分运行,则需要调用一些API以确保设备永远不会进入挂起模式。
您需要安排以下代码,每10秒至少运行一次。
::SystemIdleTimerReset ();
::SHIdleTimerReset();
::keybd_event(VK_LBUTTON, 0, KEYEVENTF_SILENT, 0);
::keybd_event(VK_LBUTTON, 0, KEYEVENTF_KEYUP | KEYEVENTF_SILENT, 0);
如果您的应用程序作为后台应用程序运行,那么您需要将代码放在无人值守的电源模式块上,同时还要执行上述代码。有关无人值守电源模式的详细信息,请参阅我的answer。
答案 1 :(得分:2)
引用(听起来真的很熟悉)仍然是真的。唯一能够在暂停之前完成工作的组件是驱动程序,它们也有很多限制。
暂停背后的一般想法是对应用程序透明,并且通常不是一个好主意。
答案 2 :(得分:0)
您是否尝试过使用OpenNETCF中公开的事件?我主要是一个WinCE的人,但我发现有人会发布一个不能可靠地通知你电源状态变化的平台,这是桌面和移动设备之间最重要的区别之一。
答案 3 :(得分:0)
根据http://social.msdn.microsoft.com/Forums/en-US/windowsmobiledev/thread/229dd6a2-f231-4aeb-ad90-c6995ba155cf/除了Windows Mobile上的POWER_STATE_SUSPEND之外,还有另一个电源状态POWER_STATE_UNATTENDED。
如果WM设备被暂停,您首先获得POWER_STATE_UNATTENDED,然后获得POWER_STATE_SUSPEND。
使用:: RequestPowerNotifications()API并过滤PBT_TRANSITION,可以处理POWER_STATE_SUSPEND和POWER_STATE_UNATTENDED的转换。
处理POWER_STATE_SUSPEND的问题在于它通常在设备恢复后由您的代码处理。我在Web上发现了一个建议,即对调用:: ReadMsgQueue(...,INFINITE,...)的线程使用实时优先级并进行处理。
为此,我们需要使用CE特定的:: CeSetThreadPriority(),因为它允许设置实时优先级。我无耻地使用0优先权。
通常,这种方式我能够可靠地处理POWER_STATE_UNATTENDED并且不太可靠地处理POWER_STATE_SUSPEND,因为我操作相当耗时(约2秒)。
对于我的任务处理,POWER_STATE_UNATTENDED是我真正需要处理的。
答案 4 :(得分:0)