summaryrefslogtreecommitdiffstats
path: root/src/corelib/thread/qpromise.qdoc
diff options
context:
space:
mode:
authorAndrei Golubev <andrei.golubev@qt.io>2020-06-11 17:16:54 +0300
committerAndrei Golubev <andrei.golubev@qt.io>2020-06-18 18:28:41 +0300
commit68de38ded1c0e5387ae29aacaee50ba5dacfc59a (patch)
tree4bef76d45efcf52fcbebb862c353776b3b93cbd7 /src/corelib/thread/qpromise.qdoc
parentb0f445a1526fa43563522d865c5ad1546201003c (diff)
Document QPromise API
Documented QPromise. Added snippets under auto tests to ensure they are compiled and run in CI. Task-number: QTBUG-81586 Change-Id: I20084e38f9d2f6fc8540f95ee03ec3d2827177e8 Reviewed-by: Sona Kurazyan <sona.kurazyan@qt.io>
Diffstat (limited to 'src/corelib/thread/qpromise.qdoc')
-rw-r--r--src/corelib/thread/qpromise.qdoc231
1 files changed, 231 insertions, 0 deletions
diff --git a/src/corelib/thread/qpromise.qdoc b/src/corelib/thread/qpromise.qdoc
new file mode 100644
index 0000000000..e78e16bdd6
--- /dev/null
+++ b/src/corelib/thread/qpromise.qdoc
@@ -0,0 +1,231 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Free Documentation License Usage
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of
+** this file. Please review the following information to ensure
+** the GNU Free Documentation License version 1.3 requirements
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*! \class QPromise
+ \inmodule QtCore
+ \threadsafe
+ \brief The QPromise class provides a way to store computation results to be accessed by QFuture.
+ \since 6.0
+
+ \ingroup thread
+
+ QPromise provides a simple way to communicate progress and results of the
+ user-defined computation to QFuture in an asynchronous fashion. For the
+ communication to work, QFuture must be constructed by QPromise.
+
+ You can use QPromise based workloads as an alternative to \l {Qt Concurrent}
+ framework when fine-grained control is needed or high-level communication
+ primitive to accompany QFuture is sufficient.
+
+ The simplest case of promise and future collaboration would be a single
+ result communication:
+
+ \snippet snippet_qpromise.cpp basic
+
+ By design, QPromise is a move-only object. This behavior helps to ensure
+ that whenever the promise is destroyed, the associated future object is
+ notified and will not wait forever for the results to become available.
+ However, this is inconvenient if one wants to use the same promise to report
+ results from different threads. There is no specific way to do that at the
+ moment, but known mechanisms exist, such as the use of smart pointers or raw
+ pointers/references. QSharedPointer is a good default choice if you want to
+ copy your promise and use it in multiple places simultaneously. Raw pointers
+ or references are, in a sense, easier, and probably perform better (since
+ there is no need to do a resource management) but may lead to dangling.
+
+ Here is an example of how a promise can be used in multiple threads:
+
+ \snippet snippet_qpromise.cpp multithread_init
+ \codeline
+ \snippet snippet_qpromise.cpp multithread_main
+
+ \sa QFuture
+*/
+
+/*! \fn template <typename T> QPromise<T>::QPromise()
+
+ Constructs a QPromise with a default state.
+*/
+
+/*! \fn template <typename T> QPromise<T>::QPromise(QPromise<T> &&other)
+
+ Move constructs a new QPromise from \a other.
+
+ \sa operator=()
+*/
+
+/*! \fn template <typename T> QPromise<T> &QPromise<T>::operator=(QPromise<T> &&other)
+
+ Move assigns \a other to this promise and returns a reference to this
+ promise.
+*/
+
+/*! \fn template <typename T> QPromise<T>::~QPromise()
+
+ Destroys the promise.
+
+ \note The promise implicitly transitions to a cancelled state on destruction
+ unless reportFinished() is called beforehand by the user.
+*/
+
+/*! \fn template <typename T> QFuture<T> QPromise<T>::future() const
+
+ Returns a future associated with this promise.
+*/
+
+/*! \fn template <typename T> void QPromise<T>::addResult(const T &result, int index = -1)
+
+ Adds \a result to the internal result collection at \a index position. If
+ index is unspecified, \a result is added to the end of the collection.
+
+ You can get a result at a specific index by calling QFuture::resultAt().
+
+ \note It is possible to specify an arbitrary index and request result at
+ that index. However, some QFuture methods operate with continuous results.
+ For instance, iterative approaches that use QFuture::resultCount() or
+ QFuture::const_iterator. In order to get all available results without
+ thinking if there are index gaps or not, use QFuture::results().
+*/
+
+/*! \fn template <typename T> void QPromise<T>::addResult(T &&result, int index = -1)
+
+ \overload
+*/
+
+/*! \fn template<typename T> void QPromise<T>::setException(const QException &e)
+
+ Sets exception \a e to be the result of the computation.
+
+ \note You can set at most one exception throughout the computation
+ execution.
+
+ \note This method must not be used after QFuture::cancel() or
+ reportFinished().
+
+ \sa isCanceled()
+*/
+
+/*! \fn template<typename T> void QPromise<T>::setException(std::exception_ptr e)
+
+ \overload
+*/
+
+/*! \fn template<typename T> void QPromise<T>::reportStarted()
+
+ Reports that the computation is started. Calling this method is important to
+ state the beginning of the computation as QFuture methods rely on this
+ information.
+
+ \note Extra attention is required when reportStarted() is called from a
+ newly created thread. In such case, the call might naturally be delayed due
+ to the implementation details of the thread scheduling.
+
+ \sa QFuture::isStarted(), QFuture::waitForFinished(), reportFinished()
+*/
+
+/*! \fn template<typename T> void QPromise<T>::reportFinished()
+
+ Reports that the computation is finished. Once finished, no new results will
+ be added when calling addResult(). This method accompanies reportStarted().
+
+ \sa QFuture::isFinished(), QFuture::waitForFinished(), reportStarted()
+*/
+
+/*! \fn template<typename T> void QPromise<T>::suspendIfRequested()
+
+ Conditionally suspends current thread of execution and waits until resumed
+ or cancelled by the corresponding methods of QFuture. This method does not
+ block unless the computation is requested to be suspended by
+ QFuture::suspend() or another related method. If you want to check that the
+ execution has been suspended, use QFuture::isSuspended().
+
+ \note When using the same promise in multiple threads,
+ QFuture::isSuspended() becomes \c true as soon as at least one thread with
+ the promise suspends.
+
+
+ The following code snippets show the usage of suspension mechanism:
+
+ \snippet snippet_qpromise.cpp suspend_start
+
+ QFuture::suspend() requests the associated promise to suspend:
+
+ \snippet snippet_qpromise.cpp suspend_suspend
+
+ After QFuture::isSuspended() becomes \c true, you can get intermediate
+ results:
+
+ \snippet snippet_qpromise.cpp suspend_intermediateResults
+
+ When suspended, you can resume or cancel the awaiting computation:
+
+ \snippet snippet_qpromise.cpp suspend_end
+
+
+ \sa QFuture::resume(), QFuture::cancel(), QFuture::setSuspended(),
+ QFuture::toggleSuspended()
+*/
+
+/*! \fn template<typename T> bool QPromise<T>::isCanceled() const
+
+ Returns whether the computation has been cancelled with the
+ QFuture::cancel() function. The returned value \c true indicates that the
+ computation should be finished and reportFinished() called.
+
+ \note After cancellation, results currently available may still be accessed
+ by a future, but new results will not be added when calling addResult().
+*/
+
+/*! \fn template<typename T> void QPromise<T>::setProgressRange(int minimum, int maximum)
+
+ Sets the progress range of the computation to be between \a minimum and \a
+ maximum.
+
+ \sa QFuture::progressMinimum(), QFuture::progressMaximum()
+*/
+
+/*! \fn template<typename T> void QPromise<T>::setProgressValue(int progressValue)
+
+ Sets the progress value of the computation to \a progressValue. It is
+ possible to only increment the progress value. This is a convenience method
+ for calling setProgressValueAndText(progressValue, QString()).
+
+ \sa QFuture::progressValue()
+*/
+
+/*! \fn template<typename T> void QPromise<T>::setProgressValueAndText(int progressValue, const QString &progressText)
+
+ Sets the progress value and the progress text of the computation to \a
+ progressValue and \a progressText respectively. It is possible to only
+ increment the progress value.
+
+ \note This function has no effect if the promise is in cancelled or finished
+ state.
+
+ \sa QFuture::progressValue(), QFuture::progressText(), QFuture::cancel(),
+ reportFinished()
+*/