我有下面的代码可以工作(但它不应该工作)
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);
}在这段代码中,未来超出了范围,但是监视槽内的代码仍然被执行。
,这是因为事情发生得太快了,如果事情放缓,我的代码会失败吗?,还是调用QFutureWatcher::setFuture之后我不需要未来?
发布于 2020-02-19 16:03:42
关于未来在您的插槽中的使用的:
您的lambda槽通过值复制未来和观察者指针。因此,当插槽被调用时,它并不关心超出范围的最初的未来。
关于未来在QFutureWatcher<VariantTable> 对象:中的用法的
如果我们查看一下QFutureWatcher<T>::setFuture()在source code of QFutureWatcher中的实现,我们可以看到:
模板Q_INLINE_TEMPLATE void::setFuture(const QFuture &_future) { if (_future == m_future)返回;disconnectOutputInterface(true);m_future = _future;connectOutputInterface();}
private成员m_future被定义为QFuture<T> m_future;。
显然,QFutureWatcher拥有自己的未来副本。
因此,在您的指示:watcher->setFuture(future);之后,不再使用原始的未来。
回答你的问题:
我有下面的代码可以工作(但它不应该工作)
实际上,在前面提到的情况下,它应该可以工作:)
注意:它可能无法按预期工作,因为在您的插槽中复制的未来和在您的观察者对象中复制的未来是两个不同的实例。
https://stackoverflow.com/questions/60303696
复制相似问题