我有以下有效的代码(但它不起作用)
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之后不需要将来吗?
答案 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是两个不同的实例。