Как я могу обнаружить приостановку на Windows Mobile? - PullRequest
1 голос
/ 25 февраля 2009

Мы наблюдаем некоторую случайную потерю данных с нашим приложением на Windows Mobile, и мы подозреваем, что некоторые буферизованные данные не записываются на диск, когда устройство приостанавливается. Мы хотели бы вручную сбросить данные на диск, когда устройство собирается приостановить. В Windows мы делаем это, перехватывая сообщение WM_POWERBROADCAST, но это сообщение недоступно в Windows Mobile. Я нашел двухлетнюю цитату на доске объявлений , которая гласила:

Вы должны понимать, что вы * не * гарантированы, что будете уведомлены о приостановке * до того, как * вы снова проснетесь. То есть вы можете не получать уведомление до тех пор, пока устройство не будет повторно пробуждено. Как правило, вы не должны пытаться реагировать на приостановку из-за этого ограничения (и в любом случае ограничения на то, что вы можете делать в ответ на событие).

Это (все еще) верно для всех устройств? Есть ли способ, которым мы можем сделать это?

Ответы [ 5 ]

3 голосов
/ 25 февраля 2009

Насколько я знаю, вы правы в том, что вы не можете определить, когда устройство переходит в режим ожидания, только когда оно выходит с использованием CeRunAppAtEvent API.

Лучший подход к проблеме - попытаться предотвратить зависание устройства вокруг критических частей вашего кода.

Существует два способа сделать это в зависимости от того, как работает ваше приложение. Если он работает как часть взаимодействия с пользователем, вам нужно вызвать некоторые API, чтобы убедиться, что устройство никогда не переходит в режим ожидания.

Вам необходимо настроить следующий код для запуска по крайней мере один раз каждые 10 секунд.

    ::SystemIdleTimerReset ();
    ::SHIdleTimerReset();
    ::keybd_event(VK_LBUTTON, 0, KEYEVENTF_SILENT, 0);
    ::keybd_event(VK_LBUTTON, 0, KEYEVENTF_KEYUP | KEYEVENTF_SILENT, 0);

Если ваше приложение работает как фоновое приложение, то вам нужно поместить код вокруг блока автономного режима питания, одновременно выполняя приведенный выше код. См. Мой ответ для получения дополнительной информации о режиме автоматического управления.

2 голосов
/ 25 февраля 2009

Цитата (которая звучит действительно, очень знакомо) все еще верна. Единственные компоненты, которые гарантированно смогут завершить свою работу до приостановки, - это драйверы, которые также имеют существенный набор ограничений.

Общая идея приостановки состоит в том, чтобы быть прозрачной для приложения, и перед этим, как правило, не очень хорошая идея.

0 голосов
/ 27 мая 2009

Может быть, ответ на этот SO вопрос поможет: Как запустить код в Windows Mobile, пока он приостановлен?

0 голосов
/ 06 марта 2009

Согласно http://social.msdn.microsoft.com/Forums/en-US/windowsmobiledev/thread/229dd6a2-f231-4aeb-ad90-c6995ba155cf/, кроме POWER_STATE_SUSPEND в Windows Mobile, существует также другое состояние питания POWER_STATE_UNATTENDED.

Если устройство WM приостановлено, сначала вы получаете POWER_STATE_UNATTENDED, а затем POWER_STATE_SUSPEND.

Используя API :: RequestPowerNotifications () и фильтрацию для PBT_TRANSITION, можно обрабатывать переходы как в POWER_STATE_SUSPEND, так и в POWER_STATE_UNATTENDED.

Проблема с обработкой POWER_STATE_SUSPEND заключается в том, что она обычно обрабатывается вашим кодом после возобновления работы устройства. Я нашел в Интернете предложение использовать приоритет в реальном времени для потока, который вызывает :: ReadMsgQueue (..., INFINITE, ...) и выполняет обработку.

Для этого нам нужно использовать специфичный для CE :: CeSetThreadPriority (), поскольку он позволяет устанавливать приоритеты в реальном времени. Я бессовестно использую приоритет 0.

Как правило, таким образом я смог надежно обрабатывать POWER_STATE_UNATTENDED и не так надежно POWER_STATE_SUSPEND, потому что у меня была довольно длительная операция (~ 2 секунды).

Что касается моей задачи, POWER_STATE_UNATTENDED - это то, что мне действительно нужно.

0 голосов
/ 25 февраля 2009

Вы пытались использовать события, которые выставляются в OpenNETCF? В основном я работаю в WinCE, но я нахожу невероятным, что кто-то выпустит платформу, которая не будет достоверно информировать вас об изменениях в состоянии питания, поскольку это одно из самых важных различий между настольным и мобильным устройством.

...