如何检测Windows Mobile上的挂起?

时间:2009-02-25 16:13:17

标签: windows-mobile windows-ce suspend

我们看到Windows Mobile上的应用程序偶尔会丢失数据,我们怀疑在设备挂起时某些缓冲数据没有刷新到磁盘。我们希望在设备即将暂停时手动将数据刷新到磁盘。在Windows上,我们通过捕获WM_POWERBROADCAST消息来执行此操作,但此消息在Windows Mobile上不可用。我在a message board上发现了两年前的一句话:

你需要意识到你*不保证在你再次醒来之前你会被告知暂停*。也就是说,在设备重新唤醒之前,您可能不会收到通知。一般情况下,你不应该因为这种限制而试图做出暂停的反应(并且无论如何都要限制你对事件做出的反应)。

对于所有设备,这仍然是真的吗?我们有办法做到这一点吗?

5 个答案:

答案 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)

也许这个问题的答案有帮助:How can I run code on Windows Mobile while being suspended?