PTLib  Version 2.12.9
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
timer.h
Go to the documentation of this file.
1 /*
2  * timer.h
3  *
4  * Real time down counting time interval class.
5  *
6  * Portable Windows Library
7  *
8  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
9  *
10  * The contents of this file are subject to the Mozilla Public License
11  * Version 1.0 (the "License"); you may not use this file except in
12  * compliance with the License. You may obtain a copy of the License at
13  * http://www.mozilla.org/MPL/
14  *
15  * Software distributed under the License is distributed on an "AS IS"
16  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
17  * the License for the specific language governing rights and limitations
18  * under the License.
19  *
20  * The Original Code is Portable Windows Library.
21  *
22  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
23  *
24  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
25  * All Rights Reserved.
26  *
27  * Contributor(s): ______________________________________.
28  *
29  * $Revision: 29407 $
30  * $Author: rjongbloed $
31  * $Date: 2013-04-01 21:10:26 +1100 (Mon, 01 Apr 2013) $
32  */
33 
34 #ifndef PTLIB_TIMER_H
35 #define PTLIB_TIMER_H
36 
37 #ifdef P_USE_PRAGMA
38 #pragma interface
39 #endif
40 
41 
42 #include <ptlib/notifier.h>
43 #include <ptclib/threadpool.h>
44 
45 
46 // To avoid ambiguous operator error we need a one for every integer variant
47 #define PTIMER_OPERATORS(cls) \
48  cls & operator=( int16_t rhs) { this->SetInterval(rhs); return *this; } \
49  cls & operator=(uint16_t rhs) { this->SetInterval(rhs); return *this; } \
50  cls & operator=( int32_t rhs) { this->SetInterval(rhs); return *this; } \
51  cls & operator=(uint32_t rhs) { this->SetInterval(rhs); return *this; } \
52  cls & operator=( int64_t rhs) { this->SetInterval(rhs); return *this; } \
53  cls & operator=(uint64_t rhs) { this->SetInterval(rhs); return *this; } \
54  cls & operator=(const PTimeInterval & rhs) { this->SetInterval(rhs.GetMilliSeconds()); return *this; } \
55 
56 
71 {
72  PCLASSINFO(PSimpleTimer, PTimeInterval);
73 
74  public:
81  long milliseconds = 0,
82  int seconds = 0,
83  int minutes = 0,
84  int hours = 0,
85  int days = 0
86  );
88  const PTimeInterval & time
89  );
91  const PSimpleTimer & timer
92  );
93 
101  DWORD milliseconds
102  );
104  const PTimeInterval & time
105  );
107  const PSimpleTimer & timer
108  );
110 
127  virtual void SetInterval(
128  PInt64 milliseconds = 0,
129  long seconds = 0,
130  long minutes = 0,
131  long hours = 0,
132  int days = 0
133  );
134 
137  void Stop();
138 
141  PTimeInterval GetElapsed() const;
142 
146  PTimeInterval GetRemaining() const;
147 
150  bool IsRunning() const;
151 
154  bool HasExpired() const;
155 
158  operator bool() const;
160 
161  protected:
163 };
164 
165 
194 class PTimer : public PTimeInterval
195 {
196  PCLASSINFO(PTimer, PTimeInterval);
197 
198  public:
199  typedef unsigned IDType;
200 
208  PTimer(
209  long milliseconds = 0,
210  int seconds = 0,
211  int minutes = 0,
212  int hours = 0,
213  int days = 0
214  );
215  PTimer(
216  const PTimeInterval & time
217  );
218  PTimer(
219  const PTimer & timer
220  );
221 
229  const PTimer & timer
230  ) { SetInterval(timer.GetMilliSeconds()); return *this; }
231 
233 
237  virtual ~PTimer();
239 
253  virtual void SetInterval(
254  PInt64 milliseconds = 0,
255  long seconds = 0,
256  long minutes = 0,
257  long hours = 0,
258  int days = 0
259  );
260 
265  void RunContinuous(
266  const PTimeInterval & time // New time interval for timer.
267  );
268 
281  void Stop(
282  bool wait = true
283  );
284 
291  PBoolean IsRunning() const;
292 
297  void Pause();
298 
303  void Resume();
304 
310  PBoolean IsPaused() const;
311 
314  void Reset();
315 
318  const PTimeInterval & GetResetTime() const;
320 
335  virtual void OnTimeout();
336 
343  const PNotifier & GetNotifier() const;
344 
348  void SetNotifier(
349  const PNotifier & func // New notifier function for the timer.
350  );
352 
367  static PTimeInterval Tick();
368 
377  static unsigned Resolution();
379 
384  PInt64 GetMilliSeconds() const;
385 
388  PInt64 GetAbsoluteTime() const { return m_absoluteTime; }
390 
391  // Internal functions.
392  IDType GetTimerId() const { return m_timerId; }
393  PAtomicInteger::IntegerType GetNextSerialNumber() { return ++m_serialNumber; }
394 
395  private:
396  void Construct();
397 
398  /* Start or restart the timer from the <code>resetTime</code> variable.
399  This is an internal function.
400  */
401  void StartRunning(
402  PBoolean once // Flag for one shot or continuous.
403  );
404 
405  /* Process the timer decrementing it by the delta amount and calling the
406  <code>OnTimeout()</code> when zero. This is used internally by the
407  <code>PTimerList::Process()</code> function.
408  */
409  void Process(
410  PInt64 now // time consider as "now"
411  );
412 
413  // Member variables
414 
415  // Callback function for expired timers.
416  PNotifier m_callback;
417 
418  // The time to reset a timer to when RunContinuous() is called.
419  PTimeInterval m_resetTime;
420 
421  // Timer operates once then stops.
422  PBoolean m_oneshot;
423 
424  // Timer state.
425  enum TimerState { Stopped, Running, Paused, InTimeout } m_state;
426 
427  friend class PTimerList; // needed for Process
428  class PTimerList * m_timerList;
429 
430  IDType m_timerId;
431  PAtomicInteger m_serialNumber;
432  PInt64 m_absoluteTime;
433 
434 // Include platform dependent part of class
435 #ifdef _WIN32
436 #include "msos/ptlib/timer.h"
437 #else
438 #include "unix/ptlib/timer.h"
439 #endif
440 };
441 
442 
465 template <
466  class Work_T,
467  class Pool_T = PQueuedThreadPool<Work_T>
468 >
469 class PPoolTimer : public PTimer
470 {
471  PCLASSINFO(PPoolTimer, PTimer);
472  protected:
473  Pool_T & m_pool;
474  public:
475  PPoolTimer(Pool_T & pool)
476  : m_pool(pool)
477  {
478  }
479 
480  virtual void OnTimeout()
481  {
482  Work_T * work = CreateWork();
483  if (work != NULL)
484  m_pool.AddWork(work, GetGroup(*work));
485  }
486 
487  virtual Work_T * CreateWork() = 0;
488  virtual const char * GetGroup(const Work_T & /*work*/) const { return NULL; }
489 
491 };
492 
493 
495 template <
496  class Work_T,
497  class Base_T = Work_T,
498  class Pool_T = PQueuedThreadPool<Base_T>
499 >
500 class PPoolTimerArg0 : public PPoolTimer<Base_T, Pool_T>
501 {
503  PCLASSINFO(PPoolTimerArg0, BaseClass);
504  public:
505  PPoolTimerArg0(Pool_T & pool)
506  : BaseClass(pool)
507  {
508  }
509 
510  virtual Work_T * CreateWork() { return new Work_T(); }
511 
513 };
514 
515 
517 template <
518  class Work_T,
519  typename Arg1,
520  class Base_T = Work_T,
521  class Pool_T = PQueuedThreadPool<Base_T>
522 >
523 class PPoolTimerArg1: public PPoolTimer<Base_T, Pool_T>
524 {
526  PCLASSINFO(PPoolTimerArg1, BaseClass);
527  protected:
528  Arg1 m_arg1;
529  public:
530  PPoolTimerArg1(Pool_T & pool, Arg1 arg1)
531  : BaseClass(pool)
532  , m_arg1(arg1)
533  {
534  }
535 
536  virtual Work_T * CreateWork() { return new Work_T(m_arg1); }
537 
539 };
540 
541 
543 template <
544  class Work_T,
545  typename Arg1,
546  typename Arg2,
547  class Base_T = Work_T,
548  class Pool_T = PQueuedThreadPool<Base_T>
549 >
550 class PPoolTimerArg2: public PPoolTimer<Base_T, Pool_T>
551 {
553  PCLASSINFO(PPoolTimerArg2, BaseClass);
554  protected:
555  Arg1 m_arg1;
556  Arg2 m_arg2;
557  public:
558  PPoolTimerArg2(Pool_T & pool, Arg1 arg1, Arg2 arg2)
559  : BaseClass(pool)
560  , m_arg1(arg1)
561  , m_arg2(arg2)
562  {
563  }
564 
565  virtual Work_T * CreateWork() { return new Work_T(m_arg1, m_arg2); }
566 
568 };
569 
570 
572 template <
573  class Work_T,
574  typename Arg1,
575  typename Arg2,
576  typename Arg3,
577  class Base_T = Work_T,
578  class Pool_T = PQueuedThreadPool<Base_T>
579 >
580 class PPoolTimerArg3: public PPoolTimer<Base_T, Pool_T>
581 {
583  PCLASSINFO(PPoolTimerArg3, BaseClass);
584  protected:
585  Arg1 m_arg1;
586  Arg2 m_arg2;
587  Arg3 m_arg3;
588  public:
589  PPoolTimerArg3(Pool_T & pool, Arg1 arg1, Arg2 arg2, Arg3 arg3)
590  : BaseClass(pool)
591  , m_arg1(arg1)
592  , m_arg2(arg2)
593  , m_arg3(arg3)
594  {
595  }
596 
597  virtual Work_T * CreateWork() { return new Work_T(m_arg1, m_arg2, m_arg3); }
598 
600 };
601 
602 
603 #endif // PTLIB_TIMER_H
604 
605 
606 // End Of File ///////////////////////////////////////////////////////////////