2013-05-13 199 views
2

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

在iOS中,我可以使用dispatch_async(dispatch_get_main_queue(), ^{ /* My code */ });,在Android中我可以使用View.queueEvent()。任何人都可以告诉我如何与BB 10原生SDK相同的东西?

感谢,

解决方案更新。

我终于弄清楚了2种方法,第一种方法很简单,但它不起作用,我不知道为什么。如果有人想看,我把它放在这里。

方法1.

使用bps_channel_exec拥有该通道的线程上执行一些代码。在UI线程上创建一个通道,然后将其设置为活动状态。在工作线程上,通过调用bps_channel_get_active来获得活动通道,然后使用bps_channel_exec。但它不适合我,继续找到原因。

方法2:

这种方法比较复杂,但想法很简单。在工作线程上,将事件推送到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

回答

3

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

此外,您应该考虑使用Qt's thread API(另请参阅that one),这样可以更轻松地与应用程序的其他部分进行集成。根据我的经验,如果您的工作线程大多需要单向(线程 - >应用程序的其余部分)通信,则使用QtConcurrent::run,如果worker是复杂对象,则考虑启动线程(这将创建并启动一个线程事件循环信号/插槽),然后实例化对象并将它们推送到工作线程。然后发送给它们的信号将排队并在新线程中执行。

我不记得我在哪里看到这个建议,但是如果你在connect statements中指定last argument,你通常会做错事,至少我做过。默认行为确实覆盖了99.9%的案例。如果信号阻塞UI线程,则对象层次结构/线程关联中的某些内容是错误的。弄错它很容易。

如果你在QML了你的用户界面,看到C++ SIGNAL to QML SLOT in Qt

+0

我不使用级联,所以我不能用QT相关的API。最后,我得到了它的工作,解决方案更新。 – TienDC 2013-05-16 09:47:13

+0

你对你的UI有什么用处? – Jean 2013-05-16 13:46:30

相关问题