1 /**************************************************************************** 2 ** 3 ** Copyright (C) 2016 The Qt Company Ltd. 4 ** Contact: https://www.qt.io/licensing/ 5 ** 6 ** This file is part of the QtConcurrent module of the Qt Toolkit. 7 ** 8 ** $QT_BEGIN_LICENSE:LGPL$ 9 ** Commercial License Usage 10 ** Licensees holding valid commercial Qt licenses may use this file in 11 ** accordance with the commercial license agreement provided with the 12 ** Software or, alternatively, in accordance with the terms contained in 13 ** a written agreement between you and The Qt Company. For licensing terms 14 ** and conditions see https://www.qt.io/terms-conditions. For further 15 ** information use the contact form at https://www.qt.io/contact-us. 16 ** 17 ** GNU Lesser General Public License Usage 18 ** Alternatively, this file may be used under the terms of the GNU Lesser 19 ** General Public License version 3 as published by the Free Software 20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the 21 ** packaging of this file. Please review the following information to 22 ** ensure the GNU Lesser General Public License version 3 requirements 23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. 24 ** 25 ** GNU General Public License Usage 26 ** Alternatively, this file may be used under the terms of the GNU 27 ** General Public License version 2.0 or (at your option) the GNU General 28 ** Public license version 3 or any later version approved by the KDE Free 29 ** Qt Foundation. The licenses are as published by the Free Software 30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 31 ** included in the packaging of this file. Please review the following 32 ** information to ensure the GNU General Public License requirements will 33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and 34 ** https://www.gnu.org/licenses/gpl-3.0.html. 35 ** 36 ** $QT_END_LICENSE$ 37 ** 38 ****************************************************************************/ 39 40 /*! 41 \page qtconcurrentrun.html 42 \title Concurrent Run 43 \ingroup thread 44 45 The QtConcurrent::run() function runs a function in a separate thread. 46 The return value of the function is made available through the QFuture API. 47 48 This function is a part of the \l {Qt Concurrent} framework. 49 50 \section1 Running a Function in a Separate Thread 51 52 To run a function in another thread, use QtConcurrent::run(): 53 54 \snippet code/src_concurrent_qtconcurrentrun.cpp 0 55 56 This will run \e aFunction in a separate thread obtained from the default 57 QThreadPool. You can use the QFuture and QFutureWatcher classes to monitor 58 the status of the function. 59 60 To use a dedicated thread pool, you can pass the QThreadPool as 61 the first argument: 62 63 \snippet code/src_concurrent_qtconcurrentrun.cpp explicit-pool-0 64 65 \section1 Passing Arguments to the Function 66 67 Passing arguments to the function is done by adding them to the 68 QtConcurrent::run() call immediately after the function name. For example: 69 70 \snippet code/src_concurrent_qtconcurrentrun.cpp 1 71 72 A copy of each argument is made at the point where QtConcurrent::run() is 73 called, and these values are passed to the thread when it begins executing 74 the function. Changes made to the arguments after calling 75 QtConcurrent::run() are \e not visible to the thread. 76 77 \section1 Returning Values from the Function 78 79 Any return value from the function is available via QFuture: 80 81 \snippet code/src_concurrent_qtconcurrentrun.cpp 2 82 83 As documented above, passing arguments is done like this: 84 85 \snippet code/src_concurrent_qtconcurrentrun.cpp 3 86 87 Note that the QFuture::result() function blocks and waits for the result 88 to become available. Use QFutureWatcher to get notification when the 89 function has finished execution and the result is available. 90 91 \section1 Additional API Features 92 93 \section2 Using Member Functions 94 95 QtConcurrent::run() also accepts pointers to member functions. The first 96 argument must be either a const reference or a pointer to an instance of 97 the class. Passing by const reference is useful when calling const member 98 functions; passing by pointer is useful for calling non-const member 99 functions that modify the instance. 100 101 For example, calling QByteArray::split() (a const member function) in a 102 separate thread is done like this: 103 104 \snippet code/src_concurrent_qtconcurrentrun.cpp 4 105 106 Calling a non-const member function is done like this: 107 108 \snippet code/src_concurrent_qtconcurrentrun.cpp 5 109 110 \section2 Using Lambda Functions 111 112 Calling a lambda function is done like this: 113 114 \snippet code/src_concurrent_qtconcurrentrun.cpp 6 115 */ 116 117 /*! 118 \typedef Function 119 \internal 120 121 This typedef is a dummy required to make the \c Function 122 type name known so that clang doesn't reject functions 123 that use it. 124 */ 125 126 /*! 127 \fn QFuture<T> QtConcurrent::run(Function function, ...); 128 129 Equivalent to 130 \code 131 QtConcurrent::run(QThreadPool::globalInstance(), function, ...); 132 \endcode 133 134 Runs \a function in a separate thread. The thread is taken from the global 135 QThreadPool. Note that \a function may not run immediately; \a function 136 will only be run once a thread becomes available. 137 138 T is the same type as the return value of \a function. Non-void return 139 values can be accessed via the QFuture::result() function. 140 141 \note The QFuture returned can only be used to query for the 142 running/finished status and the return value of the function. In particular, 143 canceling or pausing can be issued only if the computations behind the future 144 has not been started. 145 146 \sa {Concurrent Run} 147 */ 148 149 /*! 150 \since 5.4 151 \fn QFuture<T> QtConcurrent::run(QThreadPool *pool, Function function, ...); 152 153 Runs \a function in a separate thread. The thread is taken from the 154 QThreadPool \a pool. Note that \a function may not run immediately; \a function 155 will only be run once a thread becomes available. 156 157 T is the same type as the return value of \a function. Non-void return 158 values can be accessed via the QFuture::result() function. 159 160 \note The QFuture returned can only be used to query for the 161 running/finished status and the return value of the function. In particular, 162 canceling or pausing can be issued only if the computations behind the future 163 has not been started. 164 165 \sa {Concurrent Run} 166 */ 167