Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
Loading...
Searching...
No Matches
qtconcurrentthreadengine.h
Go to the documentation of this file.
1
// Copyright (C) 2016 The Qt Company Ltd.
2
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
// Qt-Security score:significant reason:default
4
5
#
ifndef
QTCONCURRENT_THREADENGINE_H
6
#
define
QTCONCURRENT_THREADENGINE_H
7
8
#
include
<
QtConcurrent
/
qtconcurrent_global
.
h
>
9
10
#
if
!
defined
(
QT_NO_CONCURRENT
)
||
defined
(
Q_QDOC
)
11
12
#
include
<
QtCore
/
qthreadpool
.
h
>
13
#
include
<
QtCore
/
qfuture
.
h
>
14
#
include
<
QtCore
/
qexception
.
h
>
15
#
include
<
QtCore
/
qwaitcondition
.
h
>
16
#
include
<
QtCore
/
qatomic
.
h
>
17
#
include
<
QtCore
/
qsemaphore
.
h
>
18
19
QT_BEGIN_NAMESPACE
20
21
22
namespace
QtConcurrent
{
23
24
// The ThreadEngineBarrier counts worker threads, and allows one
25
// thread to wait for all others to finish. Tested for its use in
26
// QtConcurrent, requires more testing for use as a general class.
27
class
ThreadEngineBarrier
28
{
29
private
:
30
// The thread count is maintained as an integer in the count atomic
31
// variable. The count can be either positive or negative - a negative
32
// count signals that a thread is waiting on the barrier.
33
34
QAtomicInt count;
35
QSemaphore semaphore;
36
public
:
37
ThreadEngineBarrier
();
38
void
acquire
();
39
int
release
();
40
void
wait
();
41
int
currentCount
();
42
bool
releaseUnlessLast
();
43
};
44
45
enum
ThreadFunctionResult
{
ThrottleThread
,
ThreadFinished
};
46
47
// The ThreadEngine controls the threads used in the computation.
48
// Can be run in three modes: single threaded, multi-threaded blocking
49
// and multi-threaded asynchronous.
50
// The code for the single threaded mode is
51
class
Q_CONCURRENT_EXPORT
ThreadEngineBase
:
public
QRunnable
52
{
53
public
:
54
// Public API:
55
ThreadEngineBase
(
QThreadPool
*
pool
);
56
virtual
~
ThreadEngineBase
();
57
void
startSingleThreaded
();
58
void
startThread
();
59
bool
isCanceled
();
60
void
waitForResume
();
61
bool
isProgressReportingEnabled
();
62
void
setProgressValue
(
int
progress
);
63
void
setProgressRange
(
int
minimum
,
int
maximum
);
64
void
acquireBarrierSemaphore
();
65
void
reportIfSuspensionDone
()
const
;
66
67
protected
:
// The user overrides these:
68
virtual
void
start
() {}
69
virtual
void
finish
() {}
70
virtual
ThreadFunctionResult
threadFunction
() {
return
ThreadFinished
; }
71
virtual
bool
shouldStartThread
() {
return
!
shouldThrottleThread
(); }
72
virtual
bool
shouldThrottleThread
()
73
{
74
return
futureInterface
? (
futureInterface
->
isSuspending
() ||
futureInterface
->
isSuspended
())
75
:
false
;
76
}
77
78
private
:
79
bool
startThreadInternal
();
80
void
startThreads
();
81
void
threadExit
();
82
bool
threadThrottleExit
();
83
void
run
()
override
;
84
virtual
void
asynchronousFinish
() = 0;
85
#
ifndef
QT_NO_EXCEPTIONS
86
void
handleException
(
const
QException
&
exception
);
87
#
endif
88
protected
:
89
QFutureInterfaceBase
*
futureInterface
;
90
QThreadPool
*
threadPool
;
91
ThreadEngineBarrier
barrier
;
92
QtPrivate
::
ExceptionStore
exceptionStore
;
93
QBasicMutex
mutex
;
94
};
95
96
97
template
<
typename
T>
98
class
ThreadEngine
:
public
ThreadEngineBase
99
{
100
public
:
101
typedef
T
ResultType
;
102
103
ThreadEngine
(QThreadPool *pool) :
ThreadEngineBase
(
pool
) {}
104
105
virtual
T *
result
() {
return
nullptr
; }
106
107
QFutureInterface
<
T
> *
futureInterfaceTyped
()
108
{
109
return
static_cast
<QFutureInterface<T> *>(futureInterface);
110
}
111
112
// Runs the user algorithm using a single thread.
113
T *
startSingleThreaded
()
114
{
115
ThreadEngineBase::startSingleThreaded();
116
return
result
(
)
;
117
}
118
119
// Runs the user algorithm using multiple threads.
120
// Does not block, returns a future.
121
QFuture
<
T
>
startAsynchronously
()
122
{
123
futureInterface =
new
QFutureInterface<T>();
124
futureInterface->setThreadPool(threadPool);
125
126
// reportStart() must be called before starting threads, otherwise the
127
// user algorithm might finish while reportStart() is running, which
128
// is very bad.
129
futureInterface->reportStarted();
130
QFuture<T> future = QFuture<T>(futureInterfaceTyped());
131
start();
132
133
acquireBarrierSemaphore();
134
threadPool->start(
this
);
135
return
future;
136
}
137
138
void
asynchronousFinish
()
override
139
{
140
finish();
141
futureInterfaceTyped()->reportFinished(result());
142
delete
futureInterfaceTyped();
143
delete
this
;
144
}
145
146
147
void
reportResult
(
const
T *_result,
int
index = -1)
148
{
149
if
(futureInterface)
150
futureInterfaceTyped()->reportResult(_result, index);
151
}
152
153
void
reportResults
(
const
QList<T> &_result,
int
index = -1,
int
count = -1)
154
{
155
if
(futureInterface)
156
futureInterfaceTyped()->reportResults(_result, index, count);
157
}
158
};
159
160
// The ThreadEngineStarter class ecapsulates the return type
161
// from the thread engine.
162
// Depending on how the it is used, it will run
163
// the engine in either blocking mode or asynchronous mode.
164
template
<
typename
T>
165
class
ThreadEngineStarterBase
166
{
167
public
:
168
ThreadEngineStarterBase
(
ThreadEngine
<T> *_threadEngine)
169
:
threadEngine
(
_threadEngine
) { }
170
171
inline
ThreadEngineStarterBase
(
const
ThreadEngineStarterBase
&other)
172
:
threadEngine
(
other
.
threadEngine
) { }
173
174
QFuture
<
T
>
startAsynchronously
()
175
{
176
return
threadEngine->startAsynchronously();
177
}
178
179
operator
QFuture
<
T
>()
180
{
181
return
startAsynchronously
();
182
}
183
184
protected
:
185
ThreadEngine
<
T
> *
threadEngine
;
186
};
187
188
189
// We need to factor out the code that dereferences the T pointer,
190
// with a specialization where T is void. (code that dereferences a void *
191
// won't compile)
192
template
<
typename
T>
193
class
ThreadEngineStarter
:
public
ThreadEngineStarterBase
<T>
194
{
195
typedef
ThreadEngineStarterBase
<T> Base;
196
typedef
ThreadEngine
<T> TypedThreadEngine;
197
public
:
198
ThreadEngineStarter
(TypedThreadEngine *eng)
199
: Base(eng) { }
200
};
201
202
// Full template specialization where T is void.
203
template
<>
204
class
ThreadEngineStarter
<
void
> :
public
ThreadEngineStarterBase
<
void
>
205
{
206
public
:
207
ThreadEngineStarter
(
ThreadEngine
<
void
> *_threadEngine)
208
:
ThreadEngineStarterBase
<
void
>(
_threadEngine
) {}
209
};
210
211
//! [qtconcurrentthreadengine-1]
212
template
<
typename
ThreadEngine>
213
inline
ThreadEngineStarter
<
typename
ThreadEngine::
ResultType
>
startThreadEngine
(ThreadEngine *threadEngine)
214
{
215
return
ThreadEngineStarter
<
typename
ThreadEngine::ResultType>(threadEngine);
216
}
217
218
}
// namespace QtConcurrent
219
220
221
QT_END_NAMESPACE
222
223
#
endif
// QT_NO_CONCURRENT
224
225
#
endif
QtConcurrent::ThreadEngineBarrier
\inmodule QtConcurrent
Definition
qtconcurrentthreadengine.h:28
QtConcurrent::ThreadEngineBarrier::currentCount
int currentCount()
Definition
qtconcurrentthreadengine.cpp:108
QtConcurrent::ThreadEngineBarrier::wait
void wait()
Definition
qtconcurrentthreadengine.cpp:92
QtConcurrent::ThreadEngineBarrier::releaseUnlessLast
bool releaseUnlessLast()
Definition
qtconcurrentthreadengine.cpp:115
QtConcurrent::ThreadEngineBarrier::release
int release()
Definition
qtconcurrentthreadengine.cpp:71
QtConcurrent::ThreadEngineBarrier::ThreadEngineBarrier
ThreadEngineBarrier()
Definition
qtconcurrentthreadengine.cpp:53
QtConcurrent::ThreadEngineBarrier::acquire
void acquire()
Definition
qtconcurrentthreadengine.cpp:56
QtConcurrent::ThreadEngineBase
\inmodule QtConcurrent
Definition
qtconcurrentthreadengine.h:52
QtConcurrent::ThreadEngineStarterBase
\inmodule QtConcurrent
Definition
qtconcurrentthreadengine.h:166
QtConcurrent::ThreadEngineStarterBase::ThreadEngineStarterBase
ThreadEngineStarterBase(ThreadEngine< T > *_threadEngine)
Definition
qtconcurrentthreadengine.h:168
QtConcurrent::ThreadEngineStarterBase::ThreadEngineStarterBase
ThreadEngineStarterBase(const ThreadEngineStarterBase &other)
Definition
qtconcurrentthreadengine.h:171
QtConcurrent::ThreadEngineStarterBase::startAsynchronously
QFuture< T > startAsynchronously()
Definition
qtconcurrentthreadengine.h:174
QtConcurrent::ThreadEngineStarter< void >
Definition
qtconcurrentthreadengine.h:205
QtConcurrent::ThreadEngineStarter< void >::ThreadEngineStarter
ThreadEngineStarter(ThreadEngine< void > *_threadEngine)
Definition
qtconcurrentthreadengine.h:207
QtConcurrent::ThreadEngineStarter
\inmodule QtConcurrent
Definition
qtconcurrentthreadengine.h:194
QtConcurrent::ThreadEngineStarter::ThreadEngineStarter
ThreadEngineStarter(TypedThreadEngine *eng)
Definition
qtconcurrentthreadengine.h:198
QtConcurrent::ThreadEngine
\inmodule QtConcurrent
Definition
qtconcurrentthreadengine.h:99
QtConcurrent::ThreadEngine::ThreadEngine
ThreadEngine(QThreadPool *pool)
Definition
qtconcurrentthreadengine.h:103
QtConcurrent::ThreadEngine::startSingleThreaded
T * startSingleThreaded()
Definition
qtconcurrentthreadengine.h:113
QtConcurrent::ThreadEngine::startAsynchronously
QFuture< T > startAsynchronously()
Definition
qtconcurrentthreadengine.h:121
QtConcurrent::ThreadEngine::result
virtual T * result()
Definition
qtconcurrentthreadengine.h:105
QtConcurrent::ThreadEngine::ResultType
T ResultType
Definition
qtconcurrentthreadengine.h:101
QtConcurrent::ThreadEngine::futureInterfaceTyped
QFutureInterface< T > * futureInterfaceTyped()
Definition
qtconcurrentthreadengine.h:107
QtConcurrent::ThreadEngine::reportResult
void reportResult(const T *_result, int index=-1)
Definition
qtconcurrentthreadengine.h:147
QtConcurrent::ThreadEngine::asynchronousFinish
void asynchronousFinish() override
Definition
qtconcurrentthreadengine.h:138
QtConcurrent::ThreadEngine::reportResults
void reportResults(const QList< T > &_result, int index=-1, int count=-1)
Definition
qtconcurrentthreadengine.h:153
QT_BEGIN_NAMESPACE
Combined button and popup list for selecting options.
Definition
qsequentialanimationgroup.cpp:47
QtConcurrent
\inmodule QtConcurrent
Definition
qtconcurrentiteratekernel.cpp:29
QtConcurrent::startThreadEngine
ThreadEngineStarter< typename ThreadEngine::ResultType > startThreadEngine(ThreadEngine *threadEngine)
[qtconcurrentthreadengine-1]
Definition
qtconcurrentthreadengine.h:213
QtConcurrent::ThreadFunctionResult
ThreadFunctionResult
Definition
qtconcurrentthreadengine.h:45
QtConcurrent::ThrottleThread
@ ThrottleThread
Definition
qtconcurrentthreadengine.h:45
QtConcurrent::ThreadFinished
@ ThreadFinished
Definition
qtconcurrentthreadengine.h:45
qtbase
src
concurrent
qtconcurrentthreadengine.h
Generated on
for Qt by
1.18.0