1    	// @(#)root/base:$Id$
2    	// Author: Fons Rademakers   28/11/96
3    	
4    	/*************************************************************************
5    	 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
6    	 * All rights reserved.                                                  *
7    	 *                                                                       *
8    	 * For the licensing terms see $ROOTSYS/LICENSE.                         *
9    	 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
10   	 *************************************************************************/
11   	
12   	#ifndef ROOT_TTimer
13   	#define ROOT_TTimer
14   	
15   	
16   	//////////////////////////////////////////////////////////////////////////
17   	//                                                                      //
18   	// TTimer                                                               //
19   	//                                                                      //
20   	// Handles synchronous and a-synchronous timer events. You can use      //
21   	// this class in one of the following ways:                             //
22   	//    - Sub-class TTimer and override the Notify() method.              //
23   	//    - Re-implement the TObject::HandleTimer() method in your class    //
24   	//      and pass a pointer to this object to timer, see the SetObject() //
25   	//      method.                                                         //
26   	//    - Pass an interpreter command to timer, see SetCommand() method.  //
27   	//    - Create a TTimer, connect its Timeout() signal to the            //
28   	//      appropriate methods. Then when the time is up it will emit a    //
29   	//      Timeout() signal and call connected slots.                      //
30   	//                                                                      //
31   	//  Minimum timeout interval is defined in TSystem::ESysConstants as    //
32   	//  kItimerResolution (currently 10 ms).                                //
33   	//                                                                      //
34   	//  Signal/slots example:                                               //
35   	//       TTimer *timer = new TTimer();                                  //
36   	//       timer->Connect("Timeout()", "myObjectClassName",               //
37   	//                      myObject, "TimerDone()");                       //
38   	//       timer->Start(2000, kTRUE);   // 2 seconds single-shot          //
39   	//                                                                      //
40   	//    // Timeout signal is emitted repeadetly with minimum timeout      //
41   	//    // timer->Start(0, kFALSE);                                       //
42   	//                                                                      //
43   	//////////////////////////////////////////////////////////////////////////
44   	
45   	#ifndef ROOT_TSysEvtHandler
46   	#include "TSysEvtHandler.h"
47   	#endif
48   	#ifndef ROOT_TTime
49   	#include "TTime.h"
50   	#endif
51   	#ifndef ROOT_TString
52   	#include "TString.h"
53   	#endif
54   	
55   	
56   	
57   	class TTimer : public TSysEvtHandler {
58   	
59   	protected:
60   	   TTime     fTime;        // time out time in ms
61   	   TTime     fAbsTime;     // absolute time out time in ms
62   	   Bool_t    fTimeout;     // true if timer has timed out
63   	   Bool_t    fSync;        // true if synchrounous timer
64   	   Bool_t    fIntSyscalls; // true is a-synchronous timer is to interrupt system calls
65   	   UInt_t    fTimeID;      // the system ID of this timer (for WIN32)
66   	   TObject  *fObject;      // object to be notified (if any)
67   	   TString   fCommand;     // interpreter command to be executed
68   	
69   	private:
70   	   TTimer(const TTimer&);            // not implemented
71   	   TTimer& operator=(const TTimer&); // not implemented
72   	
73   	public:
74   	   TTimer(Long_t milliSec = 0, Bool_t mode = kTRUE);
75   	   TTimer(TObject *obj, Long_t milliSec, Bool_t mode = kTRUE);
76   	   TTimer(const char *command, Long_t milliSec, Bool_t mode = kTRUE);
77   	   virtual ~TTimer() { Remove(); }
78   	
79   	   Bool_t         CheckTimer(const TTime &now);
80   	   const char    *GetCommand() const { return fCommand.Data(); }
81   	   TObject       *GetObject() { return fObject; }
82   	   TTime          GetTime() const { return fTime; }
83   	   UInt_t         GetTimerID() { return fTimeID;}
84   	   TTime          GetAbsTime() const { return fAbsTime; }
85   	   Bool_t         HasTimedOut() const { return fTimeout; }
86   	   Bool_t         IsSync() const { return fSync; }
87   	   Bool_t         IsAsync() const { return !fSync; }
88   	   Bool_t         IsInterruptingSyscalls() const { return fIntSyscalls; }
89   	   virtual Bool_t Notify();
90   	   void           Add() { TurnOn(); }
91   	   void           Remove() { TurnOff(); }
92   	   void           Reset();
93   	   void           SetCommand(const char *command);
94   	   void           SetObject(TObject *object);
95   	   void           SetInterruptSyscalls(Bool_t set = kTRUE);
96   	   void           SetTime(Long_t milliSec) { fTime = milliSec; }
97   	   void           SetTimerID(UInt_t id = 0) { fTimeID = id; }
98   	   virtual void   Start(Long_t milliSec = -1, Bool_t singleShot = kFALSE);
99   	   virtual void   Stop() { TurnOff(); }
100  	   virtual void   TurnOn();                         //*SIGNAL*
101  	   virtual void   TurnOff();                        //*SIGNAL*
102  	   virtual void   Timeout() { Emit("Timeout()"); }  //*SIGNAL*
103  	
104  	   static void    SingleShot(Int_t milliSec, const char *receiver_class,
105  	                             void *receiver, const char *method);
106  	
107  	   ClassDef(TTimer,0)  //Handle timer event
108  	};
109  	
110  	#endif
111