00001
00002
00003
00004
00005
00012 #ifndef HTIMER_H
00013 # define HTIMER_H
00014
00019 class HTimer : public HObjNoCopy
00020 {
00021 typedef HObjNoCopy base_class;
00022 static StringPtr ClassName(void) { return "HTimer"; }
00023
00024
00025
00026 protected:
00027 uint32 m_tid;
00028 int32 m_nTimeOut;
00029 HANDLE m_hwndTarget;
00030
00031
00032
00033 public:
00034 HTimer(int32 nTimeOut = 0) : m_tid(0), m_nTimeOut(nTimeOut), m_hwndTarget(NULL)
00035 { ASSERT(nTimeOut >= 0); }
00036
00037 virtual
00038 ~HTimer(void)
00039 { (void) Stop(); }
00040
00041
00042
00043 public:
00054 ErrCode
00055 Reached(void)
00056 {
00057 ErrCode ec = HError::NoError();
00058
00059 if (IsActive())
00060 {
00061 DEBUG_LOG("HTimer::Reached() => #%lu.\n", m_tid);
00062 m_tid = 0;
00063 }
00064
00065 return ec;
00066 }
00077 ErrCode
00078 Restart(void)
00079 {
00080 ErrCode ec = HError::NoError();
00081
00082 DEBUG_LOG("HTimer::Restart() => #%lu.\n", m_tid);
00083
00084 if (!IsActive() ||
00085 (ec = Stop()) == NO_ERROR)
00086 {
00087 ec = Start();
00088 }
00089
00090 return ec;
00091 }
00099 ErrCode
00100 Start(HANDLE hWnd = NULL, int32 nTimeOut = 0)
00101 {
00102 ErrCode ec = HError::NoError();
00103
00104 if (m_nTimeOut <= 0 || nTimeOut > 0)
00105 m_nTimeOut = nTimeOut;
00106
00107 if (NULL_HND(m_hwndTarget) || GOOD_HND(hWnd))
00108 m_hwndTarget = hWnd;
00109
00110 if (GOOD_HND(hWnd) && m_nTimeOut > 0)
00111 {
00112 if (IsActive())
00113 {
00114 DEBUG_LOG("HTimer::Start() => started an active timer.\n");
00115 (void) Stop();
00116 }
00117
00118 m_tid = GI_set_timer(m_hwndTarget, m_nTimeOut);
00119
00120 if (IsActive())
00121 {
00122 DEBUG_LOG( "HTimer::Start() => started #%lu with %ld second timeout.\n",
00123 m_tid, m_nTimeOut);
00124 }
00125 else
00126 ec = HError::Set(ERR_API_ERROR, __FILE__, __LINE__);
00127 }
00128 else
00129 ec = HError::Set(ERR_BAD_PARAMETER, __FILE__, __LINE__);
00130
00131 return ec;
00132 }
00137 ErrCode
00138 Stop(void)
00139 {
00140 ErrCode ec = HError::NoError();
00141
00142 if (IsActive())
00143 {
00144 if (GI_kill_timer(m_tid) == S_OK)
00145 {
00146 DEBUG_LOG("HTimer::Stop() => stopped #%lu.\n", m_tid);
00147 }
00148 else
00149 ec = HError::Set(ERR_API_ERROR, __FILE__, __LINE__);
00150
00151 m_tid = 0;
00152 m_hwndTarget = NULL;
00153 }
00154
00155 return ec;
00156 }
00157
00158
00159
00160 public:
00163 inline uint32 GetID(void) const
00164 { return m_tid; }
00167 inline HANDLE GetTarget(void) const
00168 { return m_hwndTarget; }
00171 inline int32 GetTimeOut(void) const
00172 { return m_nTimeOut; }
00176 ErrCode SetTarget(HANDLE hWnd)
00177 {
00178 ErrCode ec = HError::NoError();
00179
00180 if (GOOD_HND(hWnd))
00181 m_hwndTarget = hWnd;
00182 else
00183 ec = HError::Set(ERR_BAD_PARAMETER, __FILE__, __LINE__);
00184
00185 return ec;
00186 }
00190 ErrCode SetTimeOut(int32 nTimeOut)
00191 {
00192 ErrCode ec = HError::NoError();
00193
00194 if (nTimeOut > 0)
00195 {
00196 if (!IsActive())
00197 m_nTimeOut = nTimeOut;
00198 else
00199 ec = HError::Set(ERR_NOT_IMPLEMENTED, __FILE__, __LINE__);
00200 }
00201 else
00202 ec = HError::Set(ERR_BAD_PARAMETER, __FILE__, __LINE__);
00203
00204 return ec;
00205 }
00206
00207
00208
00211 inline bool IsActive(void) const
00212 { return (m_tid > 0); }
00213 };
00214 #endif // HTIMER_H
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228