1 J9 y/ P# V* R9 N#ifndef QT_NO_CONCURRENT* S, N, `& O1 V+ q. ~' M1 t
6 x/ m2 I" U+ [5 n0 I#include <QtCore/qfuture.h>$ O. J* L( @ p8 S
#include <QtCore/qrunnable.h>9 u, E0 D# Y5 c; @ }
#include <QtCore/qthreadpool.h>- M' e* l9 r+ [% b! \0 o
6 c C2 O" F; f- B( b
QT_BEGIN_HEADER' o% ^3 s8 {) @6 w1 V9 e
QT_BEGIN_NAMESPACE, w# r- T$ z( X: f) D- c/ S4 q
+ ~, a& \& N6 m' S% Y, Y' H, ]8 nQT_MODULE(Core) & }/ g9 ~ U* g2 v# a* B2 M0 c: e# X
#ifndef qdoc b' H4 X' Y3 `9 }" H4 ]& [6 K+ N# L" @$ @/ [6 t( N
namespace QtConcurrent {; u( g( J( `+ N; N$ H* p) i
& D6 W4 y1 I0 k& f) A6 ?% }
template <typename T>$ L4 S: O: n% a0 Z! |
struct SelectSpecialization& [, I2 J( _# F' }7 {
{ 8 G2 q) C' f z template <class Normal, class Void>. u8 l4 `; ^5 m, r
struct Type { typedef Normal type; };2 d/ {) C" `* t1 S. q
}; 6 A4 j3 e) Z+ X. W! A 3 b4 m. @) ~) _$ Y1 a7 |template <>- t' u5 `6 a. H- I4 c3 }9 B0 p. m
struct SelectSpecialization<void> & [" o" }7 q" w/ M1 H$ S{ & p- ^0 T o& X0 ~6 Q8 e/ C( G template <class Normal, class Void> % x' T% h5 R- m y0 X9 g( o struct Type { typedef Void type; };& p+ n" s# M: P% d
}; ; F _- n$ K9 f- m5 o$ F( d9 `* W, g9 y9 s5 ?; s3 k! n- [$ d! A1 D, ~
template <typename T> % U, Y' [; Q( rclass RunFunctionTaskBase : public QFutureInterface<T> , public QRunnable + c5 I' x: W; k& q2 C8 a8 t1 M{ ! d/ [8 }% U' Q* a5 V5 Opublic:" D' k) F( ]' k* {; C1 }9 b q# Y
QFuture<T> start()1 U5 C/ I8 D) y4 y- |
{" y) _' t3 ^7 H! e% |- L( {7 `
this->setRunnable(this);# L! @2 [: V6 N3 m% a! w# j& d5 F5 X
this->reportStarted();7 A8 y# ]' n+ ?7 W) w, B0 P$ d
QFuture<T> future = this->future(); 4 S$ x; s. W( Z. T! Z$ q. u QThreadPool::globalInstance()->start(this, /*m_priority*/ 0); ' Q" L# ]4 G' v return future; / U5 u6 X6 x$ W- s8 X) l } 9 ^ `4 w4 e& d, `/ v u1 S* W) T7 t, Z- B2 W& u void run() {}3 A9 M4 u5 L9 g
virtual void runFunctor() = 0; # U6 _2 p* ~' u7 O" y* e# W! t}; ) r' K4 r }3 r* `) N/ d) m0 L' G: w" Z% ?" _0 r( H" o' G) P
template <typename T>, v3 |# S" A v7 {
class RunFunctionTask : public RunFunctionTaskBase<T>- H$ Y6 i3 a. o7 P K" v5 G7 Z
{ * n* Z( m+ X. q, i9 cpublic:5 J" S( ~0 V+ R, @( {; S# m/ q
void run(): O3 M7 X6 i, U z- b2 ]8 N6 J5 r
{0 Y" c, G) Z$ A7 i. l. Z" t
if (this->isCanceled()) {# ?" t- D% [+ a) }' @
this->reportFinished();$ w- S% g+ n2 a& \) l* s3 {
return; K2 n$ U3 d" J, {& Y7 p
} ( V+ n9 J& [& d- M0 N8 b, {; ^ this->runFunctor(); + {6 o* L- z, X R( c. v this->reportResult(result); 4 W" Y1 T1 X& ? Z$ i* w) x this->reportFinished();; Q/ Q8 W7 O+ C; \- c! W4 ~2 y
} ) z4 N& C, \' ~ T result;2 p$ P! A" N' q+ j" K8 P
};& a% M4 v# G k9 k
0 N9 t' u" t1 }) j- M& Atemplate <> ' K( r& D" K8 J6 y7 F2 G* i" Y& R! Cclass RunFunctionTask<void> : public RunFunctionTaskBase<void> 3 J1 r2 x; J9 r; E4 \5 e) B; @0 @{1 { {6 Q/ }2 s |4 R. Y
public:# j9 N; j& H9 \
void run(): j) W2 x: E0 U
{6 {8 D0 g' q. r
if (this->isCanceled()) {9 M- A8 p$ w; I- D
this->reportFinished();8 @' r" J3 Z% t# y8 }
return; 8 v( M5 r3 W! X C" g+ w0 o8 m' k } ( u1 T+ B( F" x8 q+ i2 w5 g this->runFunctor(); / C4 E0 k1 _3 p+ n- | this->reportFinished();4 e1 h1 w7 p; n
} 1 ~. n( v' ]1 l$ a* u ?; L};: U2 t8 _( B( S# k0 a
! r4 H/ I, b b I} //namespace QtConcurrent; K! R9 T H g8 H4 ?$ e& V8 W) M
" J e. o2 H0 {2 n- n( w: k, e
#endif //qdoc % H y4 u/ m( [( P; V9 [. g0 s# G: s; U2 B+ X D; h
QT_END_NAMESPACE" k, B% ]8 H; E. [) ]
QT_END_HEADER4 V2 \9 }2 j; M& [: y