Что происходит, когда 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);


Чтобы ответить на ваш вопрос:

У меня есть следующий код, который работает (но не должен работать)

Собственно, с тем, что было сказано ранее, должно работать:)

Примечание. Это может работать не так, как задумано, поскольку скопированное будущее в вашем слоте и скопированное будущее в вашем объекте-наблюдателе - это два разных экземпляра.

Другие вопросы по тегам