40 #ifndef QTCONCURRENT_REDUCEKERNEL_H 41 #define QTCONCURRENT_REDUCEKERNEL_H 43 #include <QtConcurrent/qtconcurrent_global.h> 45 #if !defined(QT_NO_CONCURRENT) || defined(Q_CLANG_QDOC) 47 #include <QtCore/qatomic.h> 48 #include <QtCore/qlist.h> 49 #include <QtCore/qmap.h> 50 #include <QtCore/qmutex.h> 51 #include <QtCore/qthread.h> 52 #include <QtCore/qthreadpool.h> 53 #include <QtCore/qvector.h> 68 enum ReduceQueueLimits {
98 Q_DECLARE_OPERATORS_FOR_FLAGS(ReduceOptions)
101 template <
typename ReduceFunctor,
typename ReduceResultType,
typename T>
104 typedef QMap<int, IntermediateResults<T> > ResultsMap;
106 const ReduceOptions reduceOptions;
109 int progress, resultsMapSize, threadCount;
110 ResultsMap resultsMap;
112 bool canReduce(
int begin)
const 117 && progress == begin));
120 void reduceResult(ReduceFunctor &reduce,
124 for (
int i = 0; i < result.
vector.size(); ++i) {
125 reduce(r, result.
vector.at(i));
129 void reduceResults(ReduceFunctor &reduce,
133 typename ResultsMap::iterator it = map.begin();
134 while (it != map.end()) {
135 reduceResult(reduce, r, it.value());
142 : reduceOptions(_reduceOptions), progress(0), resultsMapSize(0),
143 threadCount(QThreadPool::globalInstance()->maxThreadCount())
150 QMutexLocker locker(&mutex);
151 if (!canReduce(result.
begin)) {
153 resultsMap.insert(result.
begin, result);
163 reduceResult(reduce, r, result);
167 while (!resultsMap.isEmpty()) {
168 ResultsMap resultsMapCopy = resultsMap;
172 reduceResults(reduce, r, resultsMapCopy);
175 resultsMapSize -= resultsMapCopy.size();
182 reduceResult(reduce, r, result);
186 progress += result.
end - result.
begin;
189 typename ResultsMap::iterator it = resultsMap.begin();
190 while (it != resultsMap.end()) {
191 if (it.value().begin != progress)
195 reduceResult(reduce, r, it.value());
199 progress += it.value().end - it.value().begin;
200 it = resultsMap.erase(it);
206 void finish(ReduceFunctor &reduce, ReduceResultType &r)
208 reduceResults(reduce, r, resultsMap);
222 template <
typename Sequence,
typename Base,
typename Functor1,
typename Functor2>
228 ReduceOptions reduceOptions)
229 :
Base(_sequence.
begin(), _sequence.
end(), functor1, functor2, reduceOptions),
240 sequence = Sequence();
248 #endif // QT_NO_CONCURRENT Definition: qtconcurrentreducekernel.h:75
Definition: qtconcurrentreducekernel.h:102
Definition: qtconcurrentreducekernel.h:93
bool shouldStartThread()
Definition: qtconcurrentreducekernel.h:216
void runReduce(ReduceFunctor &reduce, ReduceResultType &r, const IntermediateResults< T > &result)
Definition: qtconcurrentreducekernel.h:146
void finish() override
Definition: qtconcurrentreducekernel.h:235
Definition: qtconcurrentreducekernel.h:74
QFuture< void > map(Sequence &sequence, MapFunctor map)
Definition: qtconcurrentmap.h:60
QString result
Definition: src_concurrent_qtconcurrentrun.cpp:79
ReduceOption
Definition: qtconcurrentreducekernel.h:90
bool shouldThrottle()
Definition: qtconcurrentreducekernel.h:211
Definition: qtconcurrentreducekernel.h:223
ReduceKernel(ReduceOptions _reduceOptions)
Definition: qtconcurrentreducekernel.h:141
Definition: qtconcurrentreducekernel.h:91
Sequence sequence
Definition: qtconcurrentreducekernel.h:233
The QtConcurrent namespace provides high-level APIs that make it possible to write multi-threaded pro...
Definition: qtconcurrentexception.h:51
Definition: qtconcurrentreducekernel.h:92
void finish(ReduceFunctor &reduce, ReduceResultType &r)
Definition: qtconcurrentreducekernel.h:206
SequenceHolder2(const Sequence &_sequence, Functor1 functor1, Functor2 functor2, ReduceOptions reduceOptions)
Definition: qtconcurrentreducekernel.h:225