Что происходит, когда QFuture выходит за рамки?
У меня есть следующий код, который работает (но он не должен работать)
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?
1 ответ
Об использовании будущего в вашем слоте:
Ваш лямбда-слот копирует будущее и указатель наблюдателя по значениям. Поэтому, когда слот вызывается, он не заботится об исходном будущем, которое вышло за рамки.
Об использовании будущего внутри QFutureWatcher<VariantTable>
объект:
Если мы посмотрим на QFutureWatcher<T>::setFuture()
реализация в исходном коде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
член m_future
определяется как QFuture<T> m_future;
.
Судя по всему, QFutureWatcher
владеет собственной копией данного будущего.
Следовательно, исходное будущее больше не используется после вашей инструкции: watcher->setFuture(future);
Чтобы ответить на ваш вопрос:
У меня есть следующий код, который работает (но не должен работать)
Собственно, с тем, что было сказано ранее, должно работать:)
Примечание. Это может работать не так, как задумано, поскольку скопированное будущее в вашем слоте и скопированное будущее в вашем объекте-наблюдателе - это два разных экземпляра.