Запуск фоновых служб на КПК

Недавно я купил себе новый мобильный телефон под управлением Windows Mobile 6.1 Professional. И, конечно же, в настоящее время я собираюсь написать для него код для хобби. Я планирую запустить службу как DLL, загружаемую с помощью Services.exe. Для этого необходимо собирать данные о сомах и производить обработку сомов через регулярные промежутки времени (каждые 5-10 минут).

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

Я читал всю документацию, которую смог найти в MSDN и блогах MSDN по этой теме, и мне кажется, что есть три возможных решения этой проблемы:

  1. Поддерживайте систему в состоянии «Всегда включена», периодически вызывая SystemIdleTimerReset. Это кажется немного чрезмерным, и поэтому не может быть и речи.

  2. Периодически просыпайте систему с помощью CeRunAppAtTime и переходите в автоматическое состояние для выполнения моей обработки.

  3. Используйте автоматическое состояние вместо перехода в режим полной приостановки. Это будет прозрачно для пользователя, но система никогда не перейдет в спящий режим.

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

На первый взгляд кажется, что у третьего подхода та же основная проблема, что и у первого. Тем не менее, я читал в некоторых блогах MSDN, что с помощью этого подхода можно было бы фактически сэкономить потребление батареи, вместо того, чтобы часто входить и выходить из режима ожидания (аргументами в пользу этого было то, что природа платформы WM такова. для очень небольшого расхода заряда батареи, когда система простаивает (и что переход в режим ожидания и выход из него требует довольно небольшой обработки).

Итак, я предполагаю, что мои вопросы следующие:

  • Какой подход вы порекомендуете в моей ситуации? Что касается сохранения минимального расхода батареи и красивой чистой реализации.

  • В случае подхода номер два, можно ли устранить необходимость в уведомляющем исполняемом файле? Либо с помощью альтернативных функций API, либо существующих общих приложений на платформе?

  • В случае подхода номер три, знаете ли вы какую-либо информацию / статистику, относящуюся к заявлению, что можно продлить срок службы батареи при использовании автоматического режима по сравнению с переходом в режим ожидания. Например. как часто вам нужно выводить систему из режима ожидания, прежде чем следует отдавать предпочтение автоматическому режиму.

  • Конкретный (бонусный) вопрос реализации: необходимо ли регулярно вызывать SystemIdleTimerReset, чтобы оставаться в автоматическом режиме?

И, наконец, если вы считаете, что я преждевременно отказался от подхода номер один, скажите, пожалуйста, почему.


Пожалуйста, укажите в своем ответе, основываете ли вы свой ответ на знаниях или просто на догадках (последнее тоже очень приветствуется!).

Пожалуйста, оставьте комментарий, если вы считаете, что мне нужно прояснить какие-либо части этого вопроса.


person Simon B. Jensen    schedule 11.01.2009    source источник
comment
О каком регулярном интервале мы здесь говорим? 30 секунд? 10 минут? каждый час? какую информацию вы собираете?   -  person Kevin Loney    schedule 11.01.2009
comment
Спасибо за вопрос. Мы говорим каждые 5-10 минут, желательно как можно чаще. Я не думаю, что это имеет какое-то отношение к проблеме, но информация, которую я собираю, в первую очередь является координатами GPS, я хотел бы получить подробный маршрут пройденного маршрута.   -  person Simon B. Jensen    schedule 11.01.2009


Ответы (2)


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

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

Очевидно, что в автоматическом режиме используется значительно больше энергии, чем в режиме ожидания, поскольку в режиме ожидания единственное энергопотребление предназначено для самообновления ОЗУ. В автоматическом режиме процессор постоянно получает питание и работает (и некоторые периферийные устройства тоже могут работать - зависит от того, как производитель установил свой автоматический режим).

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

person ctacke    schedule 11.01.2009
comment
Большое спасибо за ответ! Я просматривал документы MSDN для CeRunAppAtTime, в которых нет такой же разработки параметра pwszAppName, как у CeRunAppAtEvent. Это именно то, что мне нужно! - person Simon B. Jensen; 12.01.2009
comment
Возможно, вы тоже ответите на мой бонусный вопрос (или уже ответили?), Правильно ли я понял, что мне нужно регулярно сигнализировать SystemIdleTimerReset, пока я выполняю свою обработку (в автоматическом режиме), чтобы система не спала? Или он будет ждать, пока я сигнализирую PowerPolicyNotify (PPN_UNATTENDEDMODE, FALSE)? - person Simon B. Jensen; 12.01.2009

У меня был целый длинный пост, в котором подробно рассказывалось, как не следует ожидать приемлемого времени автономной работы, потому что WM не предназначен для поддержки того, что вы пытаетесь сделать, но - вы могли бы сигнализировать о своем службы при пробуждении, выполните свою обработку, а затем используйте методы из этого post, чтобы немедленно перевести устройство в спящий режим. Таким образом, вы должны иметь возможность поддерживать очень низкое соотношение времени сна и времени сна - но, как вы говорите, я только догадываюсь.

Смотрите также:

энергоэффективные приложения (MSDN)

Власть народу (Разработчики 1, Разработчики 2, Устройства)

энергоэффективный WM Приложения (сообщение в блоге)

person Coderer    schedule 15.01.2009