Что происходит, когда QFuture выходит за рамки? - PullRequest
1 голос
/ 19 февраля 2020

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

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?

1 Ответ

1 голос
/ 19 февраля 2020

Об использовании будущего в вашем слоте:

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

Об использовании будущего внутри объекта 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 member m_future определяется как QFuture<T> m_future;.

Очевидно, QFutureWatcher владеет своей собственной копией данного будущего.

Следовательно, исходное будущее больше не используется после вашего инструкция: watcher->setFuture(future);


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

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

На самом деле, с тем, что упоминалось ранее, оно должно работать:)

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

...