«Фоновая» задача в Palm OS - PullRequest
       25

«Фоновая» задача в Palm OS

4 голосов
/ 11 сентября 2008

Я пытаюсь создать приложение для Palm OS, чтобы проверять веб-сайт каждые X минут или часов и предоставлять уведомление, когда часть данных доступна. Я знаю, что такого рода вещи могут быть выполнены на новом Palm - например, мой Centro может загружать электронную почту или веб-сайты, когда приложение не загружается - но я не знаю, как это сделать. Кто-нибудь может указать мне правильное направление?

1 Ответ

7 голосов
/ 11 сентября 2008

Это возможно сделать, но очень сложно. Вам нужно сделать несколько шагов.

Во-первых, это работает только на Palm OS 5 и схематично на некоторых ранних устройствах Palm OS 5. Последние устройства лучше, но не совершенны.

Далее вам нужно будет создать сигнал тревоги для вашего приложения, используя AlmSetAlarm. Вот как вы выполняете часть «каждые X минут или часов».

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

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

Важные примечания: Вы не можете получить доступ к глобальным переменным при ответе на этот код запуска! В зависимости от настроек вашего компилятора вы, вероятно, также не сможете получить доступ к определенным функциям C ++, таким как виртуальные функции (которые внутренне используют глобальные переменные). В Codewarrior вы можете установить параметр, который поможет с этим, но я не слишком знаком с ним. Вы должны разработать свой код так, чтобы он не нуждался в глобальных переменных; Например, вы можете использовать FtrSet и FtrGet для хранения битов глобальных данных, которые вам могут понадобиться. Наконец, вы сможете получить доступ только к одному сегменту кода размером 64 КБ из 68000 машинного кода. Межсегментные переходы не работают должным образом без настройки глобалов.

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

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

Лучше для пользователя (но гораздо сложнее) стать фоновым приложением. Это немного черной магии и не очень хорошо поддерживается, но это возможно. Есть три основных шага, чтобы стать фоновым приложением:

  1. Защитите базу данных приложения с помощью DmDatabaseProtect. Это гарантирует, что ваше приложение заблокировано, поэтому его нельзя удалить.

  2. Заблокируйте свой сегмент кода с помощью MemHandleLock и MemHandleSetOwner (установите для владельца значение 0). Это гарантирует, что ваш код загружен в память и не будет перемещен.

  3. Зарегистрируйтесь для получения некоторых уведомлений. Например, sysNotifyIdleTimeEvent - отличное уведомление для периодической фоновой обработки.

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

Также убедитесь, что если вы выделяете какие-либо системные объекты (память, дескрипторы, файловые дескрипторы и т. Д.), Вы устанавливаете их владельца на 0 (системный), если ожидаете, что они сохранятся после возврата из обработчика уведомлений. В противном случае система их очистит. Если вы сделаете это, будьте супер осторожны, чтобы избежать утечек памяти и ресурсов !! Они никогда не будут очищены, если для владельца установлено значение 0!

Чтобы выйти из фонового режима, просто сделайте обратное: отмените регистрацию для уведомлений, разблокируйте сегмент кода и снимите защиту базы данных приложения.

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

...