QFuture超出范围时会发生什么?

时间:2020-02-19 15:25:01

标签: c++ qt asynchronous qfuture qfuturewatcher

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

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之后不需要将来吗?

1 个答案:

答案 0 :(得分:1)

关于您的广告位中将来的用途:

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

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

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

template <typename T>
Q_INLINE_TEMPLATE void QFutureWatcher<T>::setFuture(const QFuture<T> &_future)
{
   if (_future == m_future)
       return;

   disconnectOutputInterface(true);
   m_future = _future;
   connectOutputInterface();
}

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

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

因此,您的指示watcher->setFuture(future);

之后不再使用原始的未来。

回答您的问题:

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

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

注意:它可能无法按预期工作,因为您广告位中复制的Future和观察者对象中复制的Future是两个不同的实例。