我有以下有效的代码(但它不起作用)

void myfunction(){

  auto future = function_which_return_future();
  auto *watcher = new QFutureWatcher<VariantTable>;

  QObject::connect(watcher,&QFutureWatcher<VariantTable>::finished,this,[=](){
       VariantTable table = future.result();
       // do some stuff
       delete watcher;
   });

   watcher->setFuture(future);
}

在此代码中,future超出了范围,但受监视的插槽中的代码仍被执行。

这是因为事情发生的太快了,如果事情变慢了,我的代码可能会失败吗? 或只是我在调用QFutureWatcher::setFuture之后不需要将来的方法?

最佳答案

关于您的广告位中的 future 使用情况:

您的lambda插槽会通过值复制 future 和观察者指针。因此,当调用该插槽时,它并不关心超出范围的原始将来。

关于QFutureWatcher<VariantTable>对象中将来的用法:

如果我们看看source code of QFutureWatcher<T>::setFuture() 中的QFutureWatcher实现,我们可以看到:


private成员m_future定义为QFuture<T> m_future;

显然,QFutureWatcher拥有自己的给定 future 副本。

因此,在您执行以下指令后,不再使用原始的将来:watcher->setFuture(future);
要回答您的问题:



实际上,使用前面提到的内容,它应该可以工作:)

注意:可能无法按预期工作,因为插槽中的复制的Future和Watcher对象中的复制的Future是两个不同的实例。

关于c++ - QFuture超出范围时会发生什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60303696/

10-10 16:42