OpendTect  6.3
paralleltask.h
Go to the documentation of this file.
1 #pragma once
2 
3 /*+
4 ________________________________________________________________________
5 
6  (C) dGB Beheer B.V.; (LICENSE) http://opendtect.org/OpendTect_license.txt
7  Author: A.H.Bril/K.Tingdahl
8  Date: 13-10-1999
9 ________________________________________________________________________
10 
11 -*/
12 
13 #include "basicmod.h"
14 #include "task.h"
15 #include "atomic.h"
16 
17 class ParallelTaskRunner;
18 
19 
64 mExpClass(Basic) ParallelTask : public Task
66 public:
67  virtual ~ParallelTask();
68 
69  bool execute() { return executeParallel(true); }
75  virtual bool executeParallel(bool parallel);
82  void setProgressMeter(ProgressMeter*);
83  od_int64 nrDone() const;
85 
86  od_int64 totalNr() const { return nrIterations(); }
87  static uiString sPosFinished() { return tr("Positions finished"); }
88  static uiString sTrcFinished() { return tr("Traces finished"); }
89 
90 protected:
91 
92  virtual od_int64 nrIterations() const = 0;
95  virtual int maxNrThreads() const;
96  virtual int minThreadSize() const { return 1; }
101  virtual bool stopAllOnFailure() const { return true; }
107  ParallelTask(const char* nm=0);
108  ParallelTask(const ParallelTask&);
109  od_int64 calculateThreadSize(od_int64 totalnr,int nrthreads,
110  int thread) const;
111 
112  void addToNrDone(od_int64 increment);
117  void quickAddToNrDone(od_int64 loopidx);
121  void resetNrDone();
122 
123 private:
124  virtual bool doWork(od_int64 start,od_int64 stop,int threadidx) = 0;
132  virtual bool doPrepare(int nrthreads) { return true; }
134  virtual bool doFinish(bool success) { return success; }
139  friend class ParallelTaskRunner;
142 
143 private:
144 
147 
148 };
149 
150 
179 #define mDeclareParallelCalcStd(uimsg) \
180  od_int64 sz_; \
181  bool reportprogress_; \
182  void setReport(bool yn) { reportprogress_ = yn; } \
183  od_int64 nrIterations() const { return sz_; } \
184  uiString message() const { return uimsg; } \
185  uiString nrDoneText() const { return sPosFinished(); } \
186 
187 #define mDefParallelCalcNoPars(clss,uimsg) \
188  class clss : public ParallelTask \
189  { mODTextTranslationClass(clss); \
190  public: \
191  mDeclareParallelCalcStd(uimsg); \
192  clss( od_int64 _sz_ ) : sz_(_sz_), reportprogress_(true) {} \
193 
194 #define mDefParallelCalc1Par(clss,uimsg,T1,v1) \
195  class clss : public ParallelTask \
196  { mODTextTranslationClass(clss); \
197  public: \
198  mDeclareParallelCalcStd(uimsg); \
199  T1 v1##_; \
200  clss( od_int64 _sz_, T1 _##v1##_ ) \
201  : sz_(_sz_), reportprogress_(true), v1##_(_##v1##_) {} \
202 
203 #define mDefParallelCalc2Pars(clss,uimsg,T1,v1,T2,v2) \
204  class clss : public ParallelTask \
205  { mODTextTranslationClass(clss); \
206  public: \
207  mDeclareParallelCalcStd(uimsg); \
208  T1 v1##_; T2 v2##_; \
209  clss( od_int64 _sz_, T1 _##v1##_, T2 _##v2##_ ) \
210  : sz_(_sz_), reportprogress_(true) \
211  , v1##_(_##v1##_), v2##_(_##v2##_) {} \
212 
213 #define mDefParallelCalc3Pars(clss,uimsg,T1,v1,T2,v2,T3,v3) \
214  class clss : public ParallelTask \
215  { mODTextTranslationClass(clss); \
216  public: \
217  mDeclareParallelCalcStd(uimsg); \
218  T1 v1##_; T2 v2##_; T3 v3##_; \
219  clss( od_int64 _sz_, \
220  T1 _##v1##_, T2 _##v2##_, T3 _##v3##_ ) \
221  : sz_(_sz_), reportprogress_(true) \
222  , v1##_(_##v1##_), v2##_(_##v2##_) , v3##_(_##v3##_) {} \
223 
224 #define mDefParallelCalc4Pars(clss,uimsg,T1,v1,T2,v2,T3,v3,T4,v4) \
225  class clss : public ParallelTask \
226  { mODTextTranslationClass(clss); \
227  public: \
228  mDeclareParallelCalcStd(uimsg); \
229  T1 v1##_; T2 v2##_; T3 v3##_; T4 v4##_; \
230  clss( od_int64 _sz_, \
231  T1 _##v1##_, T2 _##v2##_, T3 _##v3##_, T4 _##v4##_ ) \
232  : sz_(_sz_), reportprogress_(true) \
233  , v1##_(_##v1##_), v2##_(_##v2##_) \
234  , v3##_(_##v3##_), v4##_(_##v4##_) {} \
235 
236 
237 #define mDefParallelCalc5Pars(clss,uimsg,T1,v1,T2,v2,T3,v3,T4,v4,T5,v5) \
238  class clss : public ParallelTask \
239  { mODTextTranslationClass(clss); \
240  public: \
241  mDeclareParallelCalcStd(uimsg); \
242  T1 v1##_; T2 v2##_; T3 v3##_; T4 v4##_; T5 v5##_;\
243  clss( od_int64 _sz_, T1 _##v1##_, T2 _##v2##_, T3 _##v3##_, \
244  T4 _##v4##_, T5 _##v5##_ ) \
245  : sz_(_sz_), reportprogress_(true) \
246  , v1##_(_##v1##_), v2##_(_##v2##_) \
247  , v3##_(_##v3##_), v4##_(_##v4##_), v5##_(_##v5##_) {} \
248 
249 #define mDefParallelCalc6Pars(clss,uimsg,T1,v1,T2,v2,T3,v3,T4,v4,T5,v5,T6,v6) \
250  class clss : public ParallelTask \
251  { mODTextTranslationClass(clss); \
252  public: \
253  mDeclareParallelCalcStd(uimsg); \
254  T1 v1##_; T2 v2##_; T3 v3##_; T4 v4##_; T5 v5##_; T6 v6##_;\
255  clss( od_int64 _sz_, T1 _##v1##_, T2 _##v2##_, T3 _##v3##_, \
256  T4 _##v4##_, T5 _##v5##_, T6 _##v6##_ ) \
257  : sz_(_sz_), reportprogress_(true) \
258  , v1##_(_##v1##_), v2##_(_##v2##_) \
259  , v3##_(_##v3##_), v4##_(_##v4##_) \
260  , v5##_(_##v5##_), v6##_(_##v6##_) {} \
261 
262 #define mDefParallelCalc7Pars(clss,uimsg,T1,v1,T2,v2,T3,v3,T4,v4,T5,v5, \
263  T6,v6,T7,v7) \
264  class clss : public ParallelTask \
265  { mODTextTranslationClass(clss); \
266  public: \
267  mDeclareParallelCalcStd(uimsg); \
268  T1 v1##_; T2 v2##_; T3 v3##_; T4 v4##_; \
269  T5 v5##_; T6 v6##_; T7 v7##_; \
270  clss( od_int64 _sz_, T1 _##v1##_, T2 _##v2##_, T3 _##v3##_, \
271  T4 _##v4##_, T5 _##v5##_, T6 _##v6##_, T7 _##v7##_ ) \
272  : sz_(_sz_), reportprogress_(true) \
273  , v1##_(_##v1##_), v2##_(_##v2##_) \
274  , v3##_(_##v3##_), v4##_(_##v4##_) \
275  , v5##_(_##v5##_), v6##_(_##v6##_), v7##_(_##v7##_) {} \
276 
277 #define mDefParallelCalcBody(preop,impl,postop) \
278  bool doWork( od_int64 start, od_int64 stop, int ) \
279  { \
280  preop; \
281  for ( od_int64 idx=start; idx<=stop; idx++ ) \
282  { impl; if ( reportprogress_ ) quickAddToNrDone(idx); } \
283  postop; \
284  return true; \
285  } \
286  };
#define mExpClass(module)
Definition: commondefs.h:157
virtual bool stopAllOnFailure() const
Definition: paralleltask.h:101
static uiString sTrcFinished()
Definition: paralleltask.h:88
is an interface where processes can report their progress.
Definition: progressmeter.h:19
#define mODTextTranslationClass(clss)
Definition: uistring.h:37
ProgressMeter * progressmeter_
Definition: paralleltask.h:140
#define od_int64
Definition: plftypes.h:34
Definition: uistring.h:88
Threads::Atomic< int64_t > nrdone_
Definition: paralleltask.h:141
Generalization of a task that can be run in parallel.
Definition: paralleltask.h:64
virtual int minThreadSize() const
Definition: paralleltask.h:96
static uiString sPosFinished()
Definition: paralleltask.h:87
bool execute()
Definition: paralleltask.h:69
virtual bool doFinish(bool success)
Definition: paralleltask.h:134
int64_t totalNr() const
Definition: paralleltask.h:86
int64_t totalnrcache_
Definition: paralleltask.h:145
virtual bool doPrepare(int nrthreads)
Definition: paralleltask.h:132
Generalization of something (e.g. a computation) that needs to be done in multiple steps...
Definition: task.h:26
int64_t nrdonebigchunksz_
Definition: paralleltask.h:146

Generated at for the OpendTect seismic interpretation project. Copyright (C): dGB Beheer B. V. 2017