3

我有以下有效的代码(但它不应该有效)

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 超出了范围,但 watch 的 slot 内的代码仍然被执行。

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

4

1 回答 1

1

关于未来在您的插槽中的使用:

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

关于QFutureWatcher<VariantTable>对象内部future的用法:

如果我们看一下源代码中QFutureWatcher<T>::setFuture()的实现,我们可以看到:QFutureWatcher

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);


要回答您的问题:

我有以下有效的代码(但它不应该有效)

实际上,按照前面提到的,它应该可以工作:)

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

于 2020-02-19T16:03:42.820 回答