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