diff options
-rw-r--r-- | src/concurrent/doc/snippets/code/src_concurrent_qtconcurrenttask.cpp | 4 | ||||
-rw-r--r-- | src/concurrent/qtaskbuilder.h | 12 | ||||
-rw-r--r-- | src/concurrent/qtaskbuilder.qdoc | 19 | ||||
-rw-r--r-- | src/concurrent/qtconcurrenttask.qdoc | 5 | ||||
-rw-r--r-- | tests/auto/concurrent/qtconcurrenttask/tst_qtconcurrenttask.cpp | 15 |
5 files changed, 55 insertions, 0 deletions
diff --git a/src/concurrent/doc/snippets/code/src_concurrent_qtconcurrenttask.cpp b/src/concurrent/doc/snippets/code/src_concurrent_qtconcurrenttask.cpp index bec45ba3bf..b067b49e7e 100644 --- a/src/concurrent/doc/snippets/code/src_concurrent_qtconcurrenttask.cpp +++ b/src/concurrent/doc/snippets/code/src_concurrent_qtconcurrenttask.cpp @@ -125,3 +125,7 @@ QtConcurrent::task([]{ return 42; }).onThreadPool(pool).spawn(); //! [10] QtConcurrent::task([]{ return 42; }).withPriority(10).spawn(); //! [10] + +//! [11] +QtConcurrent::task([]{ qDebug("Hello, world!"); }).spawn(FutureResult::Ignore); +//! [11] diff --git a/src/concurrent/qtaskbuilder.h b/src/concurrent/qtaskbuilder.h index 5fc2bccfb5..074dad1c6b 100644 --- a/src/concurrent/qtaskbuilder.h +++ b/src/concurrent/qtaskbuilder.h @@ -52,6 +52,8 @@ QT_BEGIN_NAMESPACE namespace QtConcurrent { +enum class FutureResult { Ignore }; + using InvokeResultType = int; template <class Task, class ...Args> @@ -61,6 +63,8 @@ public: [[nodiscard]] QFuture<InvokeResultType> spawn(); + void spawn(FutureResult); + template <class ...ExtraArgs> [[nodiscard]] QTaskBuilder<Task, ExtraArgs...> withArguments(ExtraArgs &&...args); @@ -78,6 +82,8 @@ public: namespace QtConcurrent { +enum class FutureResult { Ignore }; + template <class Task, class ...Args> class QTaskBuilder { @@ -89,6 +95,12 @@ public: ->start(startParameters); } + void spawn(FutureResult) + { + (new StoredFunctionCall<Task, Args...>(std::move(taskWithArgs))) + ->start(startParameters); + } + template <class ...ExtraArgs> [[nodiscard]] constexpr auto withArguments(ExtraArgs &&...args) diff --git a/src/concurrent/qtaskbuilder.qdoc b/src/concurrent/qtaskbuilder.qdoc index 8352cae17a..1340307806 100644 --- a/src/concurrent/qtaskbuilder.qdoc +++ b/src/concurrent/qtaskbuilder.qdoc @@ -45,6 +45,13 @@ */ /*! + \fn template <class Task, class ...Args> void QtConcurrent::QTaskBuilder<Task, Args...>::spawn(QtConcurrent::FutureResult) + + Runs the task in a separate thread. This is a non-blocking call. + The task might not start immediately. +*/ + +/*! \fn template <class Task, class ...Args> template <class ...ExtraArgs> [[nodiscard]] QTaskBuilder<Task, ExtraArgs...> QtConcurrent::QTaskBuilder<Task, Args...>::withArguments(ExtraArgs &&...args) Sets the arguments \a args the task will be invoked with. The code is ill-formed @@ -80,3 +87,15 @@ The real implementation also contains a compile-time check for whether the task can be invoked with the specified arguments or not. */ + +/*! + \enum QtConcurrent::FutureResult + + This enum type is used to invoke a special overload of + QtConcurrent::QTaskBuilder::spawn(QtConcurrent::FutureResult) + that doesn't return a future object. + + \value Ignore + An auxiliary tag which introduced to improve code + readability. +*/ diff --git a/src/concurrent/qtconcurrenttask.qdoc b/src/concurrent/qtconcurrenttask.qdoc index e25e485bd1..9000b424fe 100644 --- a/src/concurrent/qtconcurrenttask.qdoc +++ b/src/concurrent/qtconcurrenttask.qdoc @@ -143,6 +143,11 @@ You can set the priority for a task: \snippet code/src_concurrent_qtconcurrenttask.cpp 10 + + If you don't need a future object, you can call + QtConcurrent::QTaskBuilder::spawn(QtConcurrent::FutureResult::Ignore): + + \snippet code/src_concurrent_qtconcurrenttask.cpp 11 */ /*! diff --git a/tests/auto/concurrent/qtconcurrenttask/tst_qtconcurrenttask.cpp b/tests/auto/concurrent/qtconcurrenttask/tst_qtconcurrenttask.cpp index 0d08efa463..b8a82dfa14 100644 --- a/tests/auto/concurrent/qtconcurrenttask/tst_qtconcurrenttask.cpp +++ b/tests/auto/concurrent/qtconcurrenttask/tst_qtconcurrenttask.cpp @@ -43,6 +43,7 @@ private Q_SLOTS: void useCustomThreadPool(); void setPriority(); void adjustAllSettings(); + void ignoreFutureResult(); }; using namespace QtConcurrent; @@ -155,6 +156,20 @@ void tst_QtConcurrentTask::adjustAllSettings() QCOMPARE(result, QVector<int>({1, 2, 3})); } +void tst_QtConcurrentTask::ignoreFutureResult() +{ + QThreadPool pool; + + std::atomic_int value = 0; + for (std::size_t i = 0; i < 10; ++i) + task([&value]{ ++value; }) + .onThreadPool(pool) + .spawn(FutureResult::Ignore); + + pool.waitForDone(); + + QCOMPARE(value, 10); +} QTEST_MAIN(tst_QtConcurrentTask) #include "tst_qtconcurrenttask.moc" |