OpendTect  6.6
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  RCS: $Id$
10 ________________________________________________________________________
11 
12 -*/
13 
14 #include "basicmod.h"
15 #include "task.h"
16 #include "atomic.h"
17 
18 class ParallelTaskRunner;
19 
20 
65 mExpClass(Basic) ParallelTask : public Task
67 public:
68  virtual ~ParallelTask();
69 
70  bool execute() { return executeParallel(true); }
76  virtual bool executeParallel(bool parallel);
84  od_int64 nrDone() const;
86 
87  od_int64 totalNr() const { return nrIterations(); }
88  static uiString sPosFinished() { return tr("Positions finished"); }
89  static uiString sTrcFinished() { return tr("Traces finished"); }
90 
91 protected:
92 
93  virtual od_int64 nrIterations() const = 0;
96  virtual int maxNrThreads() const;
97  virtual int minThreadSize() const { return 1; }
102  virtual bool stopAllOnFailure() const { return true; }
108  ParallelTask(const char* nm=0);
110  od_int64 calculateThreadSize(od_int64 totalnr,int nrthreads,
111  int thread) const;
112 
113  void addToNrDone(od_int64 increment);
118  void quickAddToNrDone(od_int64 loopidx);
122  void resetNrDone();
123 
124 private:
125  virtual bool doWork(od_int64 start,od_int64 stop,int threadidx) = 0;
133  virtual bool doPrepare(int nrthreads) { return true; }
135  virtual bool doFinish(bool success) { return success; }
140  friend class ParallelTaskRunner;
143 
144 private:
145 
148 
149 };
150 
151 
180 #define mDeclareParallelCalcStd(uimsg) \
181  od_int64 sz_; \
182  bool reportprogress_; \
183  void setReport(bool yn) { reportprogress_ = yn; } \
184  od_int64 nrIterations() const { return sz_; } \
185  uiString uiMessage() const { return uimsg; } \
186  uiString uiNrDoneText() const { return sPosFinished(); } \
187 
188 #define mDefParallelCalcNoPars(clss,uimsg) \
189  class clss : public ParallelTask \
190  { mODTextTranslationClass(clss) \
191  public: \
192  mDeclareParallelCalcStd(uimsg) \
193  clss( od_int64 _sz_ ) : sz_(_sz_), reportprogress_(true) {} \
194 
195 #define mDefParallelCalc1Par(clss,uimsg,T1,v1) \
196  class clss : public ParallelTask \
197  { mODTextTranslationClass(clss) \
198  public: \
199  mDeclareParallelCalcStd(uimsg) \
200  T1 v1##_; \
201  clss( od_int64 _sz_, T1 _##v1##_ ) \
202  : sz_(_sz_), reportprogress_(true), v1##_(_##v1##_) {} \
203 
204 #define mDefParallelCalc2Pars(clss,uimsg,T1,v1,T2,v2) \
205  class clss : public ParallelTask \
206  { mODTextTranslationClass(clss) \
207  public: \
208  mDeclareParallelCalcStd(uimsg) \
209  T1 v1##_; T2 v2##_; \
210  clss( od_int64 _sz_, T1 _##v1##_, T2 _##v2##_ ) \
211  : sz_(_sz_), reportprogress_(true) \
212  , v1##_(_##v1##_), v2##_(_##v2##_) {} \
213 
214 #define mDefParallelCalc3Pars(clss,uimsg,T1,v1,T2,v2,T3,v3) \
215  class clss : public ParallelTask \
216  { mODTextTranslationClass(clss) \
217  public: \
218  mDeclareParallelCalcStd(uimsg) \
219  T1 v1##_; T2 v2##_; T3 v3##_; \
220  clss( od_int64 _sz_, \
221  T1 _##v1##_, T2 _##v2##_, T3 _##v3##_ ) \
222  : sz_(_sz_), reportprogress_(true) \
223  , v1##_(_##v1##_), v2##_(_##v2##_) , v3##_(_##v3##_) {} \
224 
225 #define mDefParallelCalc4Pars(clss,uimsg,T1,v1,T2,v2,T3,v3,T4,v4) \
226  class clss : public ParallelTask \
227  { mODTextTranslationClass(clss) \
228  public: \
229  mDeclareParallelCalcStd(uimsg) \
230  T1 v1##_; T2 v2##_; T3 v3##_; T4 v4##_; \
231  clss( od_int64 _sz_, \
232  T1 _##v1##_, T2 _##v2##_, T3 _##v3##_, T4 _##v4##_ ) \
233  : sz_(_sz_), reportprogress_(true) \
234  , v1##_(_##v1##_), v2##_(_##v2##_) \
235  , v3##_(_##v3##_), v4##_(_##v4##_) {} \
236 
237 
238 #define mDefParallelCalc5Pars(clss,uimsg,T1,v1,T2,v2,T3,v3,T4,v4,T5,v5) \
239  class clss : public ParallelTask \
240  { mODTextTranslationClass(clss) \
241  public: \
242  mDeclareParallelCalcStd(uimsg) \
243  T1 v1##_; T2 v2##_; T3 v3##_; T4 v4##_; T5 v5##_;\
244  clss( od_int64 _sz_, T1 _##v1##_, T2 _##v2##_, T3 _##v3##_, \
245  T4 _##v4##_, T5 _##v5##_ ) \
246  : sz_(_sz_), reportprogress_(true) \
247  , v1##_(_##v1##_), v2##_(_##v2##_) \
248  , v3##_(_##v3##_), v4##_(_##v4##_), v5##_(_##v5##_) {} \
249 
250 #define mDefParallelCalc6Pars(clss,uimsg,T1,v1,T2,v2,T3,v3,T4,v4,T5,v5,T6,v6) \
251  class clss : public ParallelTask \
252  { mODTextTranslationClass(clss) \
253  public: \
254  mDeclareParallelCalcStd(uimsg) \
255  T1 v1##_; T2 v2##_; T3 v3##_; T4 v4##_; T5 v5##_; T6 v6##_;\
256  clss( od_int64 _sz_, T1 _##v1##_, T2 _##v2##_, T3 _##v3##_, \
257  T4 _##v4##_, T5 _##v5##_, T6 _##v6##_ ) \
258  : sz_(_sz_), reportprogress_(true) \
259  , v1##_(_##v1##_), v2##_(_##v2##_) \
260  , v3##_(_##v3##_), v4##_(_##v4##_) \
261  , v5##_(_##v5##_), v6##_(_##v6##_) {} \
262 
263 #define mDefParallelCalc7Pars(clss,uimsg,T1,v1,T2,v2,T3,v3,T4,v4,T5,v5, \
264  T6,v6,T7,v7) \
265  class clss : public ParallelTask \
266  { mODTextTranslationClass(clss) \
267  public: \
268  mDeclareParallelCalcStd(uimsg) \
269  T1 v1##_; T2 v2##_; T3 v3##_; T4 v4##_; \
270  T5 v5##_; T6 v6##_; T7 v7##_; \
271  clss( od_int64 _sz_, T1 _##v1##_, T2 _##v2##_, T3 _##v3##_, \
272  T4 _##v4##_, T5 _##v5##_, T6 _##v6##_, T7 _##v7##_ ) \
273  : sz_(_sz_), reportprogress_(true) \
274  , v1##_(_##v1##_), v2##_(_##v2##_) \
275  , v3##_(_##v3##_), v4##_(_##v4##_) \
276  , v5##_(_##v5##_), v6##_(_##v6##_), v7##_(_##v7##_) {} \
277 
278 #define mDefParallelCalcBody(preop,impl,postop) \
279  bool doWork( od_int64 start, od_int64 stop, int ) \
280  { \
281  preop; \
282  for ( od_int64 idx=start; idx<=stop; idx++ ) \
283  { impl; if ( reportprogress_ ) quickAddToNrDone(idx); } \
284  postop; \
285  return true; \
286  } \
287  };
288 
ParallelTask::addToNrDone
void addToNrDone(int64_t increment)
ParallelTask::progressmeter_
ProgressMeter * progressmeter_
Definition: paralleltask.h:141
task.h
ParallelTask::nrdone_
Threads::Atomic< int64_t > nrdone_
Definition: paralleltask.h:142
ParallelTask::executeParallel
virtual bool executeParallel(bool parallel)
ParallelTask::resetNrDone
void resetNrDone()
ParallelTask::totalnrcache_
int64_t totalnrcache_
Definition: paralleltask.h:146
ParallelTask::execute
bool execute()
Definition: paralleltask.h:70
od_int64
#define od_int64
Definition: plftypes.h:35
ParallelTask::nrDone
int64_t nrDone() const
May be -1, i.e. class does not report nrdone.
ProgressMeter
is an interface where processes can report their progress.
Definition: progressmeter.h:21
ParallelTask::maxNrThreads
virtual int maxNrThreads() const
mExpClass
#define mExpClass(module)
Definition: commondefs.h:177
ParallelTask::doFinish
virtual bool doFinish(bool success)
Definition: paralleltask.h:135
ParallelTask::calculateThreadSize
int64_t calculateThreadSize(int64_t totalnr, int nrthreads, int thread) const
ParallelTask::nrIterations
virtual int64_t nrIterations() const =0
mODTextTranslationClass
#define mODTextTranslationClass(clss)
Definition: uistring.h:40
ParallelTask::doPrepare
virtual bool doPrepare(int nrthreads)
Definition: paralleltask.h:133
ParallelTask::setProgressMeter
void setProgressMeter(ProgressMeter *)
Must be called before execute()
Task
Generalization of something (e.g. a computation) that needs to be done in multiple steps.
Definition: task.h:28
ParallelTask::ParallelTask
ParallelTask(const ParallelTask &)
ParallelTask::~ParallelTask
virtual ~ParallelTask()
ParallelTask::nrdonebigchunksz_
int64_t nrdonebigchunksz_
Definition: paralleltask.h:147
ParallelTask::sTrcFinished
static uiString sTrcFinished()
Definition: paralleltask.h:89
ParallelTask::minThreadSize
virtual int minThreadSize() const
Definition: paralleltask.h:97
ParallelTask::totalNr
int64_t totalNr() const
Definition: paralleltask.h:87
ParallelTask
Generalization of a task that can be run in parallel.
Definition: paralleltask.h:66
uiString
String that is able to hold international (UTF-8) strings for the user interface.
Definition: uistring.h:121
ParallelTask::quickAddToNrDone
void quickAddToNrDone(int64_t loopidx)
ParallelTask::stopAllOnFailure
virtual bool stopAllOnFailure() const
Definition: paralleltask.h:102
atomic.h
ParallelTask::doWork
virtual bool doWork(int64_t start, int64_t stop, int threadidx)=0
ParallelTask::sPosFinished
static uiString sPosFinished()
Definition: paralleltask.h:88
ParallelTask::ParallelTask
ParallelTask(const char *nm=0)
Threads::Atomic
Definition: atomic.h:27

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