239 lines
7.6 KiB
C++
239 lines
7.6 KiB
C++
/* Timer.h
|
|
*
|
|
* Copyright (c) 1993-1995 by DataBeam Corporation, Lexington, KY
|
|
*
|
|
* Abstract:
|
|
* This class maintains the current time and dispathes function calls
|
|
* when timers expire. If a routine wants to be called in X amount of
|
|
* time, it creates a timer event with this class. When the time expires,
|
|
* the function is called. If the user wants to cancel the timer before
|
|
* it expires, he can use the DeleteTimerEvent() function.
|
|
*
|
|
* When a person creates a timer event, one of the parameters is the
|
|
* control flags. The user can set the flag so that the event is a
|
|
* one-time thing or a constant event that occurs every X milliseconds.
|
|
*
|
|
* This timer has a millisecond granularity. The time passed into the
|
|
* CreateEventTimer() function is assumed to be in milliseconds.
|
|
*
|
|
* The ProcessTimerEvents() function must be called frequently and
|
|
* regularly so that the timeouts occur promptly.
|
|
*
|
|
* Caveats:
|
|
* None.
|
|
*
|
|
* Author:
|
|
* James P. Galvin
|
|
* James W. Lawwill
|
|
*/
|
|
#ifndef _TIMER_
|
|
#define _TIMER_
|
|
|
|
/*
|
|
** Possible Error values
|
|
*/
|
|
typedef enum
|
|
{
|
|
TIMER_NO_ERROR,
|
|
TIMER_NO_TIMERS_AVAILABLE,
|
|
TIMER_NO_TIMER_MEMORY,
|
|
TIMER_INVALID_TIMER_HANDLE
|
|
}
|
|
TimerError, * PTimerError;
|
|
|
|
/*
|
|
** These defines are used in the control_flags variable in the TimerEvent
|
|
** structure. TIMER_EVENT_IN_USE is a flag used internal to the timer
|
|
** procedure. TIMER_EVENT_ONE_SHOT can be passed in by the user to
|
|
** signify that the timer should only occur once.
|
|
*/
|
|
#define TIMER_EVENT_IN_USE 0x0001
|
|
#define TIMER_EVENT_ONE_SHOT 0x0002
|
|
|
|
#define TRANSPORT_HASHING_BUCKETS 3
|
|
|
|
typedef USHORT TimerEventHandle;
|
|
typedef TimerEventHandle *PTimerEventHandle;
|
|
|
|
typedef void (IObject::*PTimerFunction) (TimerEventHandle);
|
|
|
|
/*
|
|
** Each timer event has a TimerEvent structure associated with it.
|
|
*/
|
|
typedef struct TimerEventStruct
|
|
{
|
|
TimerEventHandle event_handle;
|
|
ULong timer_duration;
|
|
ULong total_duration;
|
|
IObject *object_ptr;
|
|
PTimerFunction timer_func_ptr;
|
|
USHORT control_flags;
|
|
TimerEventStruct *next_timer_event;
|
|
TimerEventStruct *previous_timer_event;
|
|
}
|
|
TimerEvent, * PTimerEvent;
|
|
|
|
class Timer
|
|
{
|
|
public:
|
|
Timer (
|
|
Void);
|
|
~Timer (
|
|
Void);
|
|
TimerEventHandle CreateTimerEvent (
|
|
ULong timer_duration,
|
|
USHORT control_flags,
|
|
IObject * object_ptr,
|
|
PTimerFunction timer_function);
|
|
TimerError DeleteTimerEvent (
|
|
TimerEventHandle timer_event);
|
|
Void ProcessTimerEvents (
|
|
Void);
|
|
|
|
private:
|
|
USHORT Maximum_Timer_Events;
|
|
USHORT Timer_Event_Count;
|
|
SListClass Timer_Event_Free_Stack;
|
|
PTimerEvent First_Timer_Event_In_Chain;
|
|
DWORD Last_Timer_Value;
|
|
DictionaryClass Timer_List;
|
|
};
|
|
typedef Timer * PTimer;
|
|
|
|
extern PTimer System_Timer;
|
|
|
|
#define InstallTimerEvent(duration, control, func) \
|
|
(g_pSystemTimer->CreateTimerEvent((duration),(control),this,(PTimerFunction)(func)))
|
|
|
|
#endif
|
|
|
|
/*
|
|
* Timer (Void)
|
|
*
|
|
* Functional Description:
|
|
* This is the constructor for the timer class. This procedure gets
|
|
* thc current Windows system time.
|
|
*
|
|
* Formal Parameters:
|
|
* None
|
|
*
|
|
* Return Value:
|
|
* None
|
|
*
|
|
* Side Effects:
|
|
* None
|
|
*
|
|
* Caveats:
|
|
* None
|
|
*/
|
|
|
|
/*
|
|
* ~Timer (Void)
|
|
*
|
|
* Functional Description:
|
|
* This is the destructor for the timer class. This routine frees all
|
|
* memory associated with timer events.
|
|
*
|
|
* Formal Parameters:
|
|
* None
|
|
*
|
|
* Return Value:
|
|
* None
|
|
*
|
|
* Side Effects:
|
|
* None
|
|
*
|
|
* Caveats:
|
|
* None
|
|
*/
|
|
|
|
/*
|
|
* TimerEventHandle CreateTimerEvent (
|
|
* ULong timer_duration,
|
|
* USHORT control_flags,
|
|
* IObject * object_ptr,
|
|
* PTimerFunction timer_function);
|
|
*
|
|
* Functional Description:
|
|
* This routine is called to create a timer event. The routine stores the
|
|
* information passed-in in a TimerEvent structure. When the timer expires
|
|
* the function will be called.
|
|
*
|
|
* Formal Parameters:
|
|
* timer_duration - (i) Amount of time to wait before calling the
|
|
* function. The granularity of the timer
|
|
* is milliseconds.
|
|
* control_flags - (i) This is a USHORT but currently we only
|
|
* look at one of the bits. The
|
|
* TIMER_EVENT_ONE_SHOT can be passed-in by
|
|
* the user if they only want this timeout
|
|
* to occur once. If this value is 0, the
|
|
* event will occur time after time.
|
|
* object_ptr - (i) This is the data address of the object. It
|
|
* is the 'this' pointer of the calling object.
|
|
* timer_function - (i) This is the address of the function to
|
|
* call after the timer expires.
|
|
*
|
|
* Return Value:
|
|
* TimerEventHandle - This is a handle to the timer event. If you
|
|
* need to delete the timer event, pass this
|
|
* handle to the DeleteTimer() function. A NULL
|
|
* handle is returned if the create failed.
|
|
*
|
|
* Side Effects:
|
|
* None
|
|
*
|
|
* Caveats:
|
|
* None
|
|
*/
|
|
|
|
/*
|
|
* TimerError DeleteTimerEvent (TimerEventHandle timer_event)
|
|
*
|
|
* Functional Description:
|
|
* This routine is called by the user to delete a timer event that is
|
|
* currently active.
|
|
*
|
|
* Formal Parameters:
|
|
* timer_event - (i) Handle to a timer event
|
|
*
|
|
* Return Value:
|
|
* TIMER_NO_ERROR - Successful Delete
|
|
* TIMER_NO_TIMER_MEMORY - The timer_event can't exist because
|
|
* there was never any Timer memory
|
|
* TIMER_INVALID_TIMER_HANDLE - timer_event is not in our list
|
|
* of timers
|
|
*
|
|
* Side Effects:
|
|
* None
|
|
*
|
|
* Caveats:
|
|
* None
|
|
*/
|
|
|
|
/*
|
|
* Void ProcessTimerEvents (Void)
|
|
*
|
|
* Functional Description:
|
|
* This routine MUST be called frequently and regularly so that we can
|
|
* manage our timers. This function gets the current system time and
|
|
* goes through each of the timers to see which have expired. If a timer
|
|
* has expired, we call the function associated with it. Upon return,
|
|
* if the timer was marked as a one-shot event, we remove it from our
|
|
* list of timers.
|
|
*
|
|
* Formal Parameters:
|
|
* None
|
|
*
|
|
* Return Value:
|
|
* None
|
|
*
|
|
* Side Effects:
|
|
* None
|
|
*
|
|
* Caveats:
|
|
* None
|
|
*/
|
|
|
|
|