首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >阻塞QFuture.result()或QFutureWatcher.waitForFinished();

阻塞QFuture.result()或QFutureWatcher.waitForFinished();
EN

Stack Overflow用户
提问于 2014-08-19 21:18:41
回答 2查看 6.2K关注 0票数 3

因此,我已经使用了QtConcurrent::run一段时间了,它非常棒。但是现在我需要这个函数来返回一个对象。因此,我使用伪代码

代码语言:javascript
复制
QFutureWatcher<MyObject> fw;
QFuture<MyObject> t1 = QtConcurrent::run(&thOb, &MythreadObjFunc::getList, ConSettings, form, query);
fw.setFuture(t1);
// Both .results() and waitForFinished() block
fw.waitForFinished();
MyObject entries = t1.result();

然后,我遍历myObject。问题是,这是阻塞的,例如,我的主要GUI没有响应。这就是我开始使用QtConcurrent::run的全部原因。

因此,建议让我的GUI执行QtConcurrent::run并获得对象返回而不是块的方法是什么?我想到了信号和插槽,其中信号将来自QtConcurrent::run,但这意味着它将来自另一个线程,并且我阅读了不推荐的内容。

耽误您时间,实在对不起。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-19 21:35:27

在QtConcurrent::run()中,您不能发出任何信号。可运行函数不是QObject。这是第一件事。

另一件事是,QFutureWatcher::waitForFinished()阻止执行,直到线程结束其执行为止。这就是我们想要的行为。如果要等待函数完成,为什么还要在单独的线程上启动它呢?这没有任何意义。

最简单的解决方案是使您的函数成为QObject继承类的成员,将实例移动到另一个线程,启动计算并发出done()信号。Qt的信号和插槽系统是线程安全的,是使用它的最佳方式。Qt提供了一个出色的文档,涵盖了这个主题。你应该从这里开始读:http://qt-project.org/doc/qt-4.8/threads.html

票数 1
EN

Stack Overflow用户

发布于 2014-08-20 00:12:21

您不应该在GUI线程中使用任何waitForFinished函数。相反,将一个插槽连接到未来观察者的finished信号。有关示例,请参见this answer

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25393144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档