我有以下有效的代码(但它不起作用)
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/