我有一个工作线程(pthread)来处理背景上的一些东西,然后我想在屏幕上显示结果。所以我必须在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
答案 0 :(得分:3)
您应该使用信号和插槽。发送到对象的事件在其事件循环中执行,发送到UI对象的ergo信号在UI线程中排队并执行。
此外,您应该考虑使用Qt's thread API,(另请参阅that one),这样可以更轻松地与应用的其余部分进行集成。
根据我的经验,如果你的工作线程主要需要单向(线程 - >应用程序的其余部分)通信,请使用QtConcurrent::run,如果worker是一个复杂的对象,请考虑启动一个线程(创建并启动信号/槽的事件循环,然后实例化您的对象并将它们推送到工作线程。然后发送给它们的信号将排队并在新线程中执行。
我不记得我在哪里看到了这个建议,但是如果你在last argument中指定connect statements,你通常会做错事,至少我做错了。默认行为确实覆盖了99.9%的案例。如果信号阻塞了UI线程,则对象层次结构/线程关联中的某些内容是错误的。并且很容易弄错。
如果您使用QML制作了自己的用户界面,请参阅C++ SIGNAL to QML SLOT in Qt