2

我有一个工作线程(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. 但它对我不起作用,继续寻找原因。

方法2。

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

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

在 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
      }
   }

   ...
}

这里有一个很好的样本 。

4

1 回答 1

3

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

此外,您应该考虑使用Qt 的线程 API(另请参阅那个),这将使与您的应用程序的其余部分的集成更加容易。

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

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

如果您使用 QML 制作 UI,请参阅Qt 中的 C++ SIGNAL 到 QML SLOT

于 2013-05-13T19:43:29.027 回答