当 QFuture 超出范围时会发生什么?
What happens when QFuture goes out of scope?
我有以下有效的代码(但它不应该有效)
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 超出了范围,但 watched 槽中的代码仍会执行。
这是因为事情发生得太快了吗?如果事情变慢,我的代码会不会失败? 或者只是我在调用 QFutureWatcher::setFuture 后不需要 future ?
关于未来在你的slot中的使用:
您的 lambda 插槽按值复制未来和观察者指针。因此当插槽被调用时,它不关心超出范围的原始未来。
关于QFutureWatcher<VariantTable>
对象中future的用法:
如果我们看一下 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
拥有给定未来的自己的副本。
因此,根据您的指示,原来的 future 不再使用:watcher->setFuture(future);
回答你的问题:
I have following code which works (but it should not work)
实际上,按照前面提到的,它应该可以工作:)
注意:它可能无法按预期工作,因为在您的插槽中复制的未来和在您的观察者对象中复制的未来是两个不同的实例。
我有以下有效的代码(但它不应该有效)
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 超出了范围,但 watched 槽中的代码仍会执行。
这是因为事情发生得太快了吗?如果事情变慢,我的代码会不会失败? 或者只是我在调用 QFutureWatcher::setFuture 后不需要 future ?
关于未来在你的slot中的使用:
您的 lambda 插槽按值复制未来和观察者指针。因此当插槽被调用时,它不关心超出范围的原始未来。
关于QFutureWatcher<VariantTable>
对象中future的用法:
如果我们看一下 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
拥有给定未来的自己的副本。
因此,根据您的指示,原来的 future 不再使用:watcher->setFuture(future);
回答你的问题:
I have following code which works (but it should not work)
实际上,按照前面提到的,它应该可以工作:)
注意:它可能无法按预期工作,因为在您的插槽中复制的未来和在您的观察者对象中复制的未来是两个不同的实例。