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;
}