为了避免在GUI线程中按一下按钮进行计算,我尝试在单独的线程中运行它。
只要我想要有能力监控进度,我的代码就是基于这源代码的。
所以,我的代码是:
futureWatcher.setFuture(QtConcurrent::mapped(library_pool.cbegin(), library_pool.cend(), util->loadFilesInLibrary(library_pool)));
futureWatcher.waitForFinished();
table = QFuture::result(); 它非常类似于qt文档中给定的sorce,但它提供了相应的错误:
C2893: Failed to specialize function template 'QFuture<QtPrivate::MapResultType<void,MapFunctor>::ResultType> QtConcurrent::mapped(Iterator,Iterator,MapFunctor)'
C2780: 'QFuture<QtPrivate::MapResultType<void,MapFunctor>::ResultType> QtConcurrent::mapped(const Sequence &,MapFunctor)': expects 2 arguments - 3 provided
C2955: 'QFuture': use of class template requires template argument list
'QFuture<T>::result': illegal call of non-static member function那么,如何使用button_clicked槽中的非GUI类的函数正确地填充工作线程而不使用GUI?
UPD
现在,我已经成功地编译了代码,这就是它的工作原理:
futureWatcher.setFuture(QtConcurrent::run(&this->util, &Utils::loadFilesInLibrary, library_pool.at(0)));
futureWatcher.waitForFinished();
library_pool = future.result();但是,在运行时,单击“仍将导致错误”按钮:

我试图运行的函数没有生成任何小部件,所以这条消息的原因还不清楚。
我读过几个问题(比如这),在这些问题中,所有的代码都可以工作,但它只驻留在main()中,这与我的需要相去甚远。因此,同样地,我如何从GUI线程启动它?
发布于 2017-07-18 15:11:35
您可以在包装器的帮助下对QtConcurrent方法使用非静态成员。在Qt论坛上有更多关于它的讨论。下面是另一个类似的问题询问如何使用包装器。
struct AddWrapper {
Utils *utils = nullptr;
typedef MyType result_type;
AddWrapper(Util *u): instance(u) {};
MyType operator()(const MyType &t) const {
return instance->longMethod(t);
}
}
Utils *foo = new Utils();
AddWrapper wrapper(foo);
QFuture<MyType> results = QtConcurrent::mapped(myList, wrapper);https://stackoverflow.com/questions/45150526
复制相似问题