【问题标题】:"Background" task in palm OSpalm OS 中的“后台”任务
【发布时间】:2008-09-10 21:19:39
【问题描述】:

我正在尝试创建一个 Palm OS 应用程序,以每隔 X 分钟或几小时检查一次网站,并在有数据可用时提供通知。我知道这种事情可以在新的 Palm 上完成——例如,当应用程序不在顶部时,我的 Centro 可以下载电子邮件或网站——但我不知道该怎么做。谁能指出我正确的方向?

【问题讨论】:

    标签: palm-os garnet-os


    【解决方案1】:

    这是可能的,但非常困难。您必须采取几个步骤。

    首先,这仅适用于 Palm OS 5,并且在一些早期的 Palm OS 5 设备上是粗略的。最新的设备更好,但并不完美。

    接下来,您需要使用 AlmSetAlarm 为您的应用程序创建警报。这就是您完成“每 X 分钟或几小时”部分的方法。

    当警报触发时,您的应用程序将获得一个 sysAppLaunchCmdAlarmTriggered 启动代码,即使它尚未运行。如果你只想做一些简单快速的事情,你可以响应启动代码来做,你就完成了。

    在警报启动代码中完成您的工作后,请务必设置下一个警报,以便您继续被呼叫。

    重要提示:响应此启动代码时,您无法访问全局变量!根据编译器中的设置,您可能也无法访问某些 C++ 功能,例如虚函数(在内部使用全局变量)。您可以在 Codewarrior 中设置一个可以帮助解决此问题的设置,但我不太熟悉它。您应该构建您的代码,使其不需要全局变量;例如,您可以使用 FtrSet 和 FtrGet 来存储您可能需要的全局数据位。最后,您将只能访问 68000 个机器代码的单个 64KB 代码段。如果没有设置全局变量,段间跳转将无法正常工作。

    您可以通过将大部分代码移至 PNOlet 来绕过这些限制,但这是一个完全不同且更复杂的主题。

    如果您想做一些可能需要一段时间的更复杂的事情(例如加载网页或下载电子邮件),强烈建议不要在警报启动代码期间执行此操作。您可以在 sysAppLaunchCmdDisplayAlarm 启动代码中执行某些操作并向用户显示允许他们取消的表单。但这肯定会很快变得烦人。

    更好的用户体验(但更复杂)是成为后台应用程序。这有点黑魔法,并没有得到很好的支持,但这是可能的。成为后台应用程序基本上分为三个步骤:

    1. 使用 DmDatabaseProtect 保护您的应用程序数据库。这将确保您的应用程序被锁定,因此无法被删除。

    2. 使用 MemHandleLock 和 MemHandleSetOwner 锁定您的代码段(将所有者设置为 0)。这将确保您的代码被加载到内存中并且不会被移动。

    3. 注册一些通知。例如,sysNotifyIdleTimeEvent 是一个很好的通知,可以用来做一些周期性的后台处理。

    设置完成后,您可以退出警报启动代码,然后等待您的通知触发。然后,当您的通知处理程序被调用时,您将执行所有后台处理。

    同时确保如果您分配任何系统对象(内存、句柄、文件句柄等),如果您希望它们在您从通知处理程序返回后仍然存在,则将它们的所有者设置为 0(系统)。否则系统会清理它们。如果你这样做,要非常小心,以避免内存和资源泄漏!当所有者设置为 0 时,它们将永远不会被清理!

    要离开后台模式,只需执行相反的操作:取消注册通知、解锁您的代码段并取消保护您的应用程序数据库。

    如果您在后台执行任何网络操作,请确保将套接字设置为非阻塞模式并正确处理!否则会阻塞前台应用程序并导致问题。

    【讨论】:

    • 你好蒂姆,很高兴在这里见到你!我喜欢 PocketTunes。赞!!
    • 是的,也很高兴见到你!
    猜你喜欢
    • 2013-02-19
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多