gpt4 book ai didi

c++ - 当 QFuture 超出范围时会发生什么?

转载 作者:行者123 更新时间:2023-12-01 14:53:31 24 4
gpt4 key购买 nike

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

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?

最佳答案

关于 future 在你的插槽中的使用:

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

关于future里面的用法QFutureWatcher<VariantTable>对象:

如果我们看一下 QFutureWatcher<T>::setFuture()source code of 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成员(member)m_future定义为 QFuture<T> m_future; .

显然,QFutureWatcher拥有给定 future 的自己的拷贝。

因此,在您的指示之后不再使用原始 future :watcher->setFuture(future);


回答你的问题:

I have following code which works (but it should not work)

实际上,根据前面提到的内容,它应该可以工作:)

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

关于c++ - 当 QFuture 超出范围时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60303696/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com