A Class To Encapsulate MultiMedia Timers

This simple class encapsulates the multimedia timers. To use the class include mmTimers.cpp and mmTimers.h in your project. Link with winmm.lib.
To use a timer derive a class from CMMTimers and override member timerProc. timerProc will be called when the timer goes off. Instantiate a variable of the new class.
The parameter to the constructor is the timer resolution in ms. To start a timer call startTimer. The first parameter specifies the period of the timer in ms.
The second parameter specifies whether the timer is a one shot or periodic timer. To stop a periodic timer call stopTimer.

This code was developed with Visual C++ 5.0 and has been tested on NT 4.0.

The source follows:

The header file, mmTimers.h

#ifndef ___multimedia_timers___
#define ___multimedia_timers___

#include

class CMMTimers
{
public:
CMMTimers(UINT resolution);
virtual ~CMMTimers();

UINT getTimerRes() { return timerRes; };

bool startTimer(UINT period,bool oneShot);
bool stopTimer();

virtual void timerProc() {};

protected:
UINT timerRes;
UINT timerId;
};

#endif

The source file, mmTimers.cpp

#include “StdAfx.h”
#include “mmTimers.h”

CMMTimers::CMMTimers(UINT resolution) : timerRes(0), timerId(0)
{
TIMECAPS tc;

if (TIMERR_NOERROR == timeGetDevCaps(&tc,sizeof(TIMECAPS)))
{
timerRes = min(max(tc.wPeriodMin,resolution),tc.wPeriodMax);
timeBeginPeriod(timerRes);
}
}

CMMTimers::~CMMTimers()
{
stopTimer();
if (0 != timerRes)
{
timeEndPeriod(timerRes);
timerRes = 0;
}
}

extern “C”
void CALLBACK internalTimerProc(UINT id, UINT msg,
DWORD dwUser, DWORD dw1, DWORD dw2)
{
CMMTimers * timer = (CMMTimers *)dwUser;

timer->timerProc();
}

bool CMMTimers::startTimer(UINT period,bool oneShot)
{
bool res = false;
MMRESULT result;

result = timeSetEvent(period, timerRes, internalTimerProc,
(DWORD)this,oneShot ? TIME_ONESHOT : TIME_PERIODIC);
if (NULL != result)
{
timerId = (UINT)result;
res = true;
}

return res;
}

bool CMMTimers::stopTimer()
{
MMRESULT result;

result = timeKillEvent(timerId);
if (TIMERR_NOERROR == result)
timerId = 0;

return TIMERR_NOERROR == result;
}

Download source – 1 KB

Date Last Updated: May 17, 1999

More by Author

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read