40 #ifndef QTCONCURRENT_ITERATEKERNEL_H 41 #define QTCONCURRENT_ITERATEKERNEL_H 43 #include <QtConcurrent/qtconcurrent_global.h> 45 #if !defined(QT_NO_CONCURRENT) || defined(Q_CLANG_QDOC) 47 #include <QtCore/qatomic.h> 48 #include <QtConcurrent/qtconcurrentmedian.h> 49 #include <QtConcurrent/qtconcurrentthreadengine.h> 71 void timeBeforeUser();
75 inline bool blockSizeMaxed()
77 return (m_blockSize >= maxBlockSize);
80 const int maxBlockSize;
96 void timeBeforeUser();
101 inline bool blockSizeMaxed()
103 return (m_blockSize >= maxBlockSize);
106 const int maxBlockSize;
116 template <
typename T>
121 :threadEngine(_threadEngine)
128 currentResultCount = resultCount;
129 vector.resize(qMax(resultCount, vector.count()));
134 const int useVectorThreshold = 4;
135 if (currentResultCount > useVectorThreshold) {
136 vector.resize(currentResultCount);
137 threadEngine->reportResults(vector, begin);
139 for (
int i = 0; i < currentResultCount; ++i)
140 threadEngine->reportResult(&vector.at(i), begin + i);
146 return vector.data();
179 template <
typename Iterator,
typename T>
186 : begin(_begin), end(_end), current(_begin), currentIndex(0),
187 forIteration(
selectIteration(typename std::iterator_traits<Iterator>::iterator_category())), progressReportingEnabled(true)
189 iterationCount = forIteration ? std::distance(_begin, _end) : 0;
195 { Q_UNUSED(it); Q_UNUSED(index); Q_UNUSED(result);
return false; }
196 virtual bool runIterations(Iterator _begin,
int beginIndex,
int endIndex, T *results)
197 { Q_UNUSED(_begin); Q_UNUSED(beginIndex); Q_UNUSED(endIndex); Q_UNUSED(results);
return false; }
201 progressReportingEnabled = this->isProgressReportingEnabled();
202 if (progressReportingEnabled && iterationCount > 0)
203 this->setProgressRange(0, iterationCount);
209 return (currentIndex.load() < iterationCount) && !this->shouldThrottleThread();
211 return (iteratorThreads.load() == 0);
217 return this->forThreadFunction();
219 return this->whileThreadFunction();
228 if (this->isCanceled())
231 const int currentBlockSize = blockSizeManager.
blockSize();
233 if (currentIndex.load() >= iterationCount)
237 const int beginIndex = currentIndex.fetchAndAddRelease(currentBlockSize);
238 const int endIndex = qMin(beginIndex + currentBlockSize, iterationCount);
240 if (beginIndex >= endIndex) {
245 this->waitForResume();
247 if (shouldStartThread())
250 const int finalBlockSize = endIndex - beginIndex;
255 const bool resultsAvailable = this->runIterations(begin, beginIndex, endIndex, resultReporter.
getPointer());
258 if (resultsAvailable)
262 if (progressReportingEnabled) {
263 completed.fetchAndAddAcquire(finalBlockSize);
264 this->setProgressValue(this->completed.load());
267 if (this->shouldThrottleThread())
275 if (iteratorThreads.testAndSetAcquire(0, 1) ==
false)
281 while (current != end) {
285 Iterator prev = current;
287 int index = currentIndex.fetchAndAddRelaxed(1);
288 iteratorThreads.testAndSetRelease(1, 0);
290 this->waitForResume();
292 if (shouldStartThread())
295 const bool resultAavailable = this->runIteration(prev, index, resultReporter.
getPointer());
296 if (resultAavailable)
299 if (this->shouldThrottleThread())
302 if (iteratorThreads.testAndSetAcquire(0, 1) ==
false)
328 #endif // QT_NO_CONCURRENT #define Q_CONCURRENT_EXPORT
Definition: qtconcurrent_global.h:51
Definition: qtconcurrentiteratekernel.h:180
ThreadFunctionResult whileThreadFunction()
Definition: qtconcurrentiteratekernel.h:273
ThreadFunctionResult threadFunction() override
Definition: qtconcurrentiteratekernel.h:214
const Iterator end
Definition: qtconcurrentiteratekernel.h:312
IterateKernel(Iterator _begin, Iterator _end)
Definition: qtconcurrentiteratekernel.h:185
bool shouldStartThread() override
Definition: qtconcurrentiteratekernel.h:206
ThreadFunctionResult
Definition: qtconcurrentthreadengine.h:81
int currentResultCount
Definition: qtconcurrentiteratekernel.h:149
QVector< T > vector
Definition: qtconcurrentiteratekernel.h:151
void timeBeforeUser()
Definition: qtconcurrentiteratekernel.cpp:178
QAtomicInt iteratorThreads
Definition: qtconcurrentiteratekernel.h:316
bool selectIteration(std::bidirectional_iterator_tag)
Definition: qtconcurrentiteratekernel.h:164
QAtomicInt currentIndex
Definition: qtconcurrentiteratekernel.h:314
void * getPointer()
Definition: qtconcurrentiteratekernel.h:161
void reserveSpace(int)
Definition: qtconcurrentiteratekernel.h:159
QString result
Definition: src_concurrent_qtconcurrentrun.cpp:79
Iterator current
Definition: qtconcurrentiteratekernel.h:313
Definition: qtconcurrentthreadengine.h:128
virtual bool runIteration(Iterator it, int index, T *result)
Definition: qtconcurrentiteratekernel.h:194
bool progressReportingEnabled
Definition: qtconcurrentiteratekernel.h:319
void reserveSpace(int resultCount)
Definition: qtconcurrentiteratekernel.h:126
bool forIteration
Definition: qtconcurrentiteratekernel.h:315
Definition: qtconcurrentiteratekernel.h:91
int blockSize()
Definition: qtconcurrentiteratekernel.cpp:215
ThreadEngine< T > * threadEngine
Definition: qtconcurrentiteratekernel.h:150
void reportResults(int)
Definition: qtconcurrentiteratekernel.h:160
ResultReporter(ThreadEngine< T > *_threadEngine)
Definition: qtconcurrentiteratekernel.h:120
The QtConcurrent namespace provides high-level APIs that make it possible to write multi-threaded pro...
Definition: qtconcurrentexception.h:51
ResultReporter(ThreadEngine< void > *)
Definition: qtconcurrentiteratekernel.h:158
virtual bool runIterations(Iterator _begin, int beginIndex, int endIndex, T *results)
Definition: qtconcurrentiteratekernel.h:196
Definition: qtconcurrentthreadengine.h:81
ThreadFunctionResult forThreadFunction()
Definition: qtconcurrentiteratekernel.h:222
T ResultType
Definition: qtconcurrentiteratekernel.h:183
virtual ~IterateKernel()
Definition: qtconcurrentiteratekernel.h:192
void start() override
Definition: qtconcurrentiteratekernel.h:199
Definition: qtconcurrentiteratekernel.h:67
void timeAfterUser()
Definition: qtconcurrentiteratekernel.cpp:189
QAtomicInt completed
Definition: qtconcurrentiteratekernel.h:320
const Iterator begin
Definition: qtconcurrentiteratekernel.h:311
void reportResults(int begin)
Definition: qtconcurrentiteratekernel.h:132
int iterationCount
Definition: qtconcurrentiteratekernel.h:317
T * getPointer()
Definition: qtconcurrentiteratekernel.h:144
Definition: qtconcurrentiteratekernel.h:117
Definition: qtconcurrentthreadengine.h:81