【问题标题】:How to execute some code on UI thread如何在 UI 线程上执行一些代码
【发布时间】:2013-05-13 17:14:51
【问题描述】:

我有一个工作线程(pthread)在后台处理一些事情,然后我想在屏幕上显示结果。所以我必须在UI线程或主线程上执行一些代码。

在 iOS 中我可以使用 dispatch_async(dispatch_get_main_queue(), ^{ /* My code */ });,在 Android 中我可以使用 View.queueEvent()。谁能告诉我如何使用 BB 10 原生 SDK 做同样的事情?

谢谢,

解决方案已更新。

我终于想通了2个方法,第一个很简单,但是没用,不知道为什么。如果有人想看,我把它放在这里。

方法一。

使用bps_channel_exec 在拥有通道的线程上执行一些代码。在 UI 线程上,创建一个通道,然后将其设置为活动的。而在工作线程上,通过调用bps_channel_get_active获取活动通道,然后使用bps_channel_exec。但对我不起作用,继续寻找原因。

方法二。

这个方法比较复杂,但是思路很简单。在工作线程上,将事件推送到 UI 线程。在 UI 线程主循环上,添加一个事件处理程序来处理事件的种类。

在工作线程上:通过调用bps_register_domain 注册一个域,然后通过调用bps_event_create 使用该域创建一个事件。接下来,通过调用bps_channel_push_event 将事件推送到 UI 线程上的活动通道。

关于 UI 线程主循环:

for (;;) {
   bps_event_t *event = NULL;
   bps_get_event(&event, -1);

   if (event) {
      if (bps_event_get_domain(event) == the_domain_that_is_mentioned_above) {
         // Handle the event
      }
   }

   ...
}

有一个很好的样本 here.

【问题讨论】:

    标签: blackberry-10


    【解决方案1】:

    您应该使用信号和插槽。发送到对象的事件在其事件循环中执行,因此发送到 UI 对象的信号在 UI 线程中排队并执行。

    此外,您应该考虑使用Qt's thread API,(另请参阅that one),这样可以更轻松地与您的应用程序的其余部分集成。

    根据我的经验,如果您的工作线程主要需要单向(线程 -> 应用程序的其余部分)通信,请使用 QtConcurrent::run,如果工作线程是一个复杂对象,请考虑启动一个线程(这将创建并启动信号/插槽的事件循环),然后实例化您的对象并将它们推送到工作线程。然后发送给它们的信号将在新线程中排队并执行。

    我不记得我在哪里看到了该建议,但是如果您在 connect statements 中指定 last argument,您通常会做错事,至少我是这样做的。默认行为确实涵盖了 99.9% 的情况。如果信号阻塞了 UI 线程,那么对象层次结构/线程关联中的某些东西是错误的。而且很容易出错。

    如果您使用 QML 制作 UI,请参阅 C++ SIGNAL to QML SLOT in Qt

    【讨论】:

    • 我不使用 Cascades 所以我不能使用 QT 相关的 API。最后,我得到了它的工作,更新了解决方案。
    • 你的 UI 使用什么?