首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从GUI线程通过QFuture提交并发任务

从GUI线程通过QFuture提交并发任务
EN

Stack Overflow用户
提问于 2017-07-17 17:45:49
回答 1查看 382关注 0票数 0

为了避免在GUI线程中按一下按钮进行计算,我尝试在单独的线程中运行它。

只要我想要有能力监控进度,我的代码就是基于源代码的。

所以,我的代码是:

代码语言:javascript
复制
futureWatcher.setFuture(QtConcurrent::mapped(library_pool.cbegin(), library_pool.cend(), util->loadFilesInLibrary(library_pool)));

futureWatcher.waitForFinished();

table = QFuture::result(); 

它非常类似于qt文档中给定的sorce,但它提供了相应的错误:

代码语言:javascript
复制
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

现在,我已经成功地编译了代码,这就是它的工作原理:

代码语言:javascript
复制
futureWatcher.setFuture(QtConcurrent::run(&this->util, &Utils::loadFilesInLibrary, library_pool.at(0)));

futureWatcher.waitForFinished();

library_pool = future.result();

但是,在运行时,单击“仍将导致错误”按钮:

我试图运行的函数没有生成任何小部件,所以这条消息的原因还不清楚。

我读过几个问题(比如),在这些问题中,所有的代码都可以工作,但它只驻留在main()中,这与我的需要相去甚远。因此,同样地,我如何从GUI线程启动它?

EN

回答 1

Stack Overflow用户

发布于 2017-07-18 15:11:35

您可以在包装器的帮助下对QtConcurrent方法使用非静态成员。在Qt论坛上有更多关于它的讨论。下面是另一个类似的问题询问如何使用包装器。

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45150526

复制
相关文章

相似问题

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