Я недавно купил себе новый мобильный телефон под управлением Windows Mobile 6.1 Professional. И, конечно же, я сейчас занимаюсь разработкой кода для хобби. Мой план состоит в том, чтобы служба работала как DLL, загружаемая Services.exe. Для этого необходимо собирать данные сома и выполнять обработку сома через регулярные промежутки времени (каждые 5-10 минут).
Так как мне нужно запускать это через регулярные промежутки времени, для меня это небольшая проблема, что система обычно переходит в режим ожидания (приостановка) после короткого периода бездействия пользователя.
Я читал всю документацию, которую мог найти на MSDN, и в блогах MSDN на эту тему, и мне кажется, что есть три возможных решения этой проблемы:
Держите систему в состоянии «всегда включено», периодически вызывая SystemIdleTimerReset . Это кажется немного чрезмерным, и поэтому не может быть и речи.
Периодически активируйте систему при помощи CeRunAppAtTime и войдите в необслуживаемое состояние, чтобы выполнить мою обработку.
Используйте состояние без присмотра вместо перехода в режим полной приостановки. Это будет прозрачно для пользователя, но система никогда не перейдет в спящий режим.
Второй подход представляется более предпочтительным, однако для этого требуется, чтобы система вызывала исполняемый файл при пробуждении, и единственной задачей было уведомить мой сервис о том, что он должен начать обработку. Это кажется немного ненужным, и я хотел бы избежать этого дополнительного исполняемого файла. Конечно, я мог бы переместить всю свою обработку в этот дополнительный исполняемый файл, но я хотел бы использовать некоторые из средств, предоставляемых при запуске в качестве службы, а также не иметь всплывающей программы (даже если она находится в фоновом режиме) при запуске обработки.
На первый взгляд, третий подход, похоже, имеет ту же основную проблему, что и первый. Тем не менее, я читал в некоторых блогах MSDN, что при таком подходе можно было бы реально сэкономить заряд батареи, вместо того чтобы часто входить и выходить из режима ожидания (аргументы для этого заключались в том, что природа платформы WM чтобы во время простоя система потребляла очень мало заряда батареи, а для входа и выхода из режима ожидания требуется немало обработки).
Итак, я думаю, мои вопросы следующие:
Какой подход вы бы порекомендовали в моей ситуации? Относительно сохранения минимального расхода батареи и хорошей чистой реализации.
В случае подхода № 2, возможно ли устранить необходимость в уведомляющем исполняемом файле? Либо через альтернативные функции API, либо через существующие универсальные приложения на платформе?
В случае захода на посадку номер три, знаете ли вы какую-либо информацию / статистику, относящуюся к заявке, о том, что можно продлить срок службы батареи при использовании автоматического режима до перехода в режим ожидания. Например. как часто вам нужно вывести систему из режима ожидания, прежде чем предпочтительным будет автоматический режим.
Вопрос, связанный с реализацией (бонус): необходимо ли регулярно вызывать SystemIdleTimerReset , чтобы оставаться в автоматическом режиме?
И, наконец, если вы считаете, что я преждевременно исключил подход номер один, скажите, пожалуйста, почему.
Пожалуйста, укажите в своем ответе, основываете ли вы свой ответ на знании или просто гадаете (последнее также очень приветствуется!).
Пожалуйста, оставьте комментарий, если вы считаете, что мне нужно уточнить какие-либо части этого вопроса.