diff options
author | Ivan Solovev <ivan.solovev@qt.io> | 2023-03-09 13:22:12 +0100 |
---|---|---|
committer | Ivan Solovev <ivan.solovev@qt.io> | 2023-03-28 09:45:55 +0100 |
commit | 502a7706b94380d4957a7e594fc7c4c4db8ae81b (patch) | |
tree | 2448680a8c17ded8ea5cac9e7a54c68cc9750621 /src | |
parent | e8622fb2046f94fb2c8b9a9d0c1cec6d082485e8 (diff) |
QFutureInterface: add a warning when an existing continuation is overwritten
... and also extend the documentation to explain this case explicitly.
Fixes: QTBUG-107545
Pick-to: 6.5 6.2
Change-Id: I9414cc677b037989de60e97871485018e5c8a569
Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/doc/snippets/code/src_corelib_thread_qfuture.cpp | 14 | ||||
-rw-r--r-- | src/corelib/thread/qfuture.qdoc | 9 | ||||
-rw-r--r-- | src/corelib/thread/qfutureinterface.cpp | 4 |
3 files changed, 27 insertions, 0 deletions
diff --git a/src/corelib/doc/snippets/code/src_corelib_thread_qfuture.cpp b/src/corelib/doc/snippets/code/src_corelib_thread_qfuture.cpp index 091d98539b..cf85dab226 100644 --- a/src/corelib/doc/snippets/code/src_corelib_thread_qfuture.cpp +++ b/src/corelib/doc/snippets/code/src_corelib_thread_qfuture.cpp @@ -385,3 +385,17 @@ QFuture<QFuture<QFuture<int>>>> outerFuture; QFuture<int> unwrappedFuture = outerFuture.unwrap(); //! [30] + +//! [31] +QPromise<int> p; + +QFuture<int> f1 = p.future(); +f1.then([](int) { qDebug("first"); }); + +QFuture<int> f2 = p.future(); +f2.then([](int) { qDebug("second"); }); + +p.start(); +p.addResult(42); +p.finish(); +//! [31] diff --git a/src/corelib/thread/qfuture.qdoc b/src/corelib/thread/qfuture.qdoc index 570f7de8e3..50ec206afd 100644 --- a/src/corelib/thread/qfuture.qdoc +++ b/src/corelib/thread/qfuture.qdoc @@ -75,6 +75,15 @@ If \c testFuture gets canceled, its state is propagated to the next then(), which will be also canceled. So in this case \c {Block 6} will be called. + The future can have only one continuation. Consider the following example: + + \snippet code/src_corelib_thread_qfuture.cpp 31 + + In this case \c f1 and \c f2 are effectively the same QFuture object, as + they share the same internal state. As a result, calling + \l {QFuture::}{then} on \c f2 will overwrite the continuation specified for + \c {f1}. So, only \c {"second"} will be printed when this code is executed. + QFuture also offers ways to interact with a running computation. For instance, the computation can be canceled with the cancel() function. To suspend or resume the computation, use the setSuspended() function or one of diff --git a/src/corelib/thread/qfutureinterface.cpp b/src/corelib/thread/qfutureinterface.cpp index ed46052fa7..e656527e04 100644 --- a/src/corelib/thread/qfutureinterface.cpp +++ b/src/corelib/thread/qfutureinterface.cpp @@ -834,6 +834,10 @@ void QFutureInterfaceBase::setContinuation(std::function<void(const QFutureInter // store the move-only continuation, to guarantee that the associated // future's data stays alive. if (d->continuationState != QFutureInterfaceBasePrivate::Cleaned) { + if (d->continuation) { + qWarning() << "Adding a continuation to a future which already has a continuation. " + "The existing continuation is overwritten."; + } d->continuation = std::move(func); d->continuationData = continuationFutureData; } |