Gray C++ Libraries  0.0.2
A set of C++ libraries for MSVC, GNU on Windows, WinCE, Linux
cJobBase.h
Go to the documentation of this file.
1 //
4 //
5 
6 #ifndef _INC_cJobBase_H
7 #define _INC_cJobBase_H
8 #ifndef NO_PRAGMA_ONCE
9 #pragma once
10 #endif
11 #include "cSysEvent.h"
17 
18 namespace GrayLib
19 {
20  class cJobArray;
21 
22  class GRAYLIB_LINK cJobBase : public cRefBase, public cThreadState
23  {
28  friend class cJobArray;
29 
30  private:
31  cJobArray* m_pArrayParent;
32  TIMESYS_t m_timeLast;
33  TIMESYS_t m_timeNext;
34 
35  public:
36  static const TIMESYS_t k_ASAP = 1;
37 
38  protected:
40  virtual HRESULT RunJob() = 0;
41 
42  public:
43  cJobBase(cJobArray* pArrayParent = nullptr) noexcept
44  : m_pArrayParent(pArrayParent)
45  , m_timeLast(cTimeSys::k_CLEAR)
46  , m_timeNext(cTimeSys::k_CLEAR)
47  {
48  }
49 
51  STDMETHOD_(cString, get_Name)() const = 0;
52 
53  virtual HRESULT DisposeThis()
54  {
56  RequestStopThread(false);
57  m_timeLast = cTimeSys::k_CLEAR;
58  ClearJob();
59  m_pArrayParent = nullptr; // detach.
60  return S_OK;
61  }
62 
63  virtual void put_JobParam(INT_PTR iParam)
64  {
66  UNREFERENCED_PARAMETER(iParam);
67  }
68 
69  bool isJobScheduled() const noexcept
70  {
73  return m_timeNext > cTimeSys::k_CLEAR ;
74  }
75  TIMESYS_t get_SortValue() const noexcept
76  {
77  // Allow sort by time.
78  return m_timeNext;
79  }
80  TIMESYS_t get_TimeNext() const noexcept
81  {
84  return m_timeNext;
85  }
86  TIMESECD_t get_TimeNextSec() const noexcept
87  {
91  if (!isJobScheduled())
92  {
93  return INT_MAX; // Never - not scheduled.
94  }
95  TIMESYSD_t idmSec = m_timeNext - cTimeSys::GetTimeNow();
96  return idmSec / cTimeSys::k_FREQ ;
97  }
98  TIMESECD_t get_TimeLastSec() const noexcept
99  {
102  if (m_timeLast <= cTimeSys::k_CLEAR)
103  return -1; // never before.
104  TIMESYSD_t idmSec = cTimeSys::GetTimeNow() - m_timeLast;
105  return idmSec / cTimeSys::k_FREQ;
106  }
107 
108  HRESULT RunJobX();
109 
111  {
113  return put_TimeNext(cTimeSys::k_CLEAR); // unschedule this.
114  }
116  {
120  return put_TimeNext(cTimeSys::GetTimeNow() + mSecDelay);
121  }
123  {
127  TIMESYS_t nTimeNext;
128  if (mSecDelay <= 0)
129  {
130  nTimeNext = cTimeSys::k_CLEAR; // never.
131  }
132  else if (m_timeLast == 0)
133  {
134  nTimeNext = cTimeSys::GetTimeNow() + mSecDelay;
135  }
136  else
137  {
138  // do in n Seconds from m_timeLast
139  nTimeNext = m_timeLast + mSecDelay;
140  }
141  return put_TimeNext(nTimeNext);
142  }
143  HRESULT ScheduleJobParam(INT_PTR iParam)
144  {
146  put_JobParam(iParam);
147  return put_TimeNext(cTimeSys::GetTimeNow()); // do now
148  }
149 
150  virtual void ResetJobTime()
151  {
153  ClearJob(); // default = never run this more than once.
154  }
155 
157  HRESULT put_TimeNext(TIMESYS_t nTimeNext);
158  };
160 
161  class cJobWaiter : public cJobBase
162  {
164  };
165 
166  class cJobPender : public cJobBase
167  {
169  // TODO ?
170  };
171 
172  //****************************************************************
173 
174  class GRAYLIB_LINK cJobArray : public cThreadLockArrayValue<cJobBase, TIMESYS_t>
175  {
180 
181  protected:
183 
184  public:
185  HRESULT SetWake();
186 
187  cJobPtr PopNextJobToRun();
188  HRESULT RunJobsCheck();
189 
191  {
193  return m_Wake;
194  }
195 
196  void InitAllJobs();
197  void RemoveAllJobs();
198  };
199 
200 }
201 
202 #endif
#define GRAYLIB_LINK
Definition: GrayLibBase.h:35
#define UNREFERENCED_PARAMETER(P)
< _WIN32 type thing. get rid of stupid warning.
Definition: SysTypes.h:299
INT32 HRESULT
_WIN32 style error codes. INT32
Definition: SysTypes.h:465
Definition: cJobBase.h:175
cSysEvent m_Wake
sleep until we have something to do. or <= 1 minute
Definition: cJobBase.h:182
cSysEvent & ref_Wake()
Definition: cJobBase.h:190
Definition: cJobBase.h:23
HRESULT ScheduleJobParam(INT_PTR iParam)
Definition: cJobBase.h:143
HRESULT ClearJob()
Definition: cJobBase.h:110
virtual void put_JobParam(INT_PTR iParam)
Definition: cJobBase.h:63
TIMESECD_t get_TimeLastSec() const noexcept
Definition: cJobBase.h:98
HRESULT ScheduleJob(TIMESYSD_t mSecDelay)
Definition: cJobBase.h:115
virtual void ResetJobTime()
reset the next time.
Definition: cJobBase.h:150
TIMESYS_t get_TimeNext() const noexcept
Definition: cJobBase.h:80
TIMESYS_t get_SortValue() const noexcept
Definition: cJobBase.h:75
virtual HRESULT RunJob()=0
Override this to make the job do some real work.
HRESULT ScheduleJobX(TIMESYSD_t mSecDelay)
Definition: cJobBase.h:122
virtual HRESULT DisposeThis()
Definition: cJobBase.h:53
bool isJobScheduled() const noexcept
Definition: cJobBase.h:69
cJobBase(cJobArray *pArrayParent=nullptr) noexcept
Definition: cJobBase.h:43
TIMESECD_t get_TimeNextSec() const noexcept
Definition: cJobBase.h:86
STDMETHOD_(cString, get_Name)() const =0
overload this to give the job a name.
Definition: cJobBase.h:167
Definition: cJobBase.h:162
Definition: cSysEvent.h:28
Definition: cRefPtr.h:22
Definition: cThreadArray.h:330
Definition: cThreadLock.h:137
Definition: cTimeSys.h:93
static const TIMESYS_t k_CLEAR
Definition: cTimeSys.h:99
static const TIMESYS_t k_FREQ
milliSec per Sec
Definition: cTimeSys.h:100
static TIMESYS_t GetTimeNow() noexcept
Definition: cTimeSys.h:121
Definition: cMesh.h:22
cRefPtr< cJobBase > cJobPtr
Definition: cJobBase.h:159
INT32 TIMESYSD_t
Time delta. signed milli-Seconds Span. cTimeSys::k_DMAX, cTimeSys::k_INF = MAILSLOT_WAIT_FOREVER.
Definition: cTimeSys.h:28
int TIMESECD_t
signed delta seconds. like TIMESEC_t. redefined in TimeUnits.h.
Definition: cTimeSys.h:19
UINT32 TIMESYS_t
TIMESYS_t = The normal system tick timer. milli-seconds since start of system/app ?
Definition: cTimeSys.h:27