所以我一直在使用QtConcurrent :: run并且很棒。但是现在我需要函数来返回一个对象。因此我使用伪代码
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的信号和插槽,但这意味着它将来自不同的线程并且我读了不推荐的那些。
感谢您的时间。
答案 0 :(得分:4)
你应该从不使用GUI线程中的任何waitForFinished
函数。相反,将插槽连接到未来观察者的finished
信号。有关示例,请参阅this answer。
答案 1 :(得分:1)
从QtConcurrent :: run()你不能发出任何信号。 Runnable函数不是QObject。这是第一件事。
另一件事是QFutureWatcher :: waitForFinished()阻止执行,直到线程结束执行。这是预期的行为。如果你必须等待你的功能完成,为什么你甚至在单独的线程上启动它?这毫无意义。
最简单的解决方案是使您的函数成为QObject继承类的成员,将实例移动到另一个线程,启动计算并发出done()信号。 Qt的信号和插槽系统是线程安全的,它是使用它的最佳方式。 Qt提供的优秀文档足以涵盖这一主题。你应该从这里开始阅读:http://qt-project.org/doc/qt-4.8/threads.html