|
일반적으로 윈도우 타이머는 50 ms 이하의 처리는
불가능 합니다. (제가가지고 있는 자료를 올립니다.)
이유는 잘 모르겠지만 NT 는 10 ms 정도까지는 된다구도 하지만 잘 모르죠?
타이머는 지정된 시간마다 주기적으로 애플리케이션에 메시지를 전달해주는 기능.
예를 들어 ‘5초마다 신호를 보내라’고 설정하면 5초 단위로 WM_TIMER메세지가 전달
타이머의 용도 :
자동저장, 에니메이션, 멀티태스킹, 특히 멀티미디어에서 많이 사용.
시간 단위는 밀리초(milisecond), 1~4294967295밀리초까지 지정가능. 예를 들어 1000을 지정하면 매 1초마다 WM_TIMER메세지발생, 이론상으로 매초 1000번의 타이머가 발생할 수 있지만, 실제로 PC하드웨어는 초당 18.2번 발생. 즉 54.924밀리초 이하의 정밀도는 가질 수 없다(지정은 가능하다), 타이머 메시지는 프로그램이 메시지를 처리하는 속도와도 관련이 있다. 즉 하나의 타이머 메시지를 처리하지 못한 상태로 또 타이머를 받게 되면, 이전의 타이머 메시지는 없어진다.따라서 정밀한 제어계측과 같은 분야나 실시간 장비 제어같은 분야에서는 사용할 수 없다.
그래서 multimedia timer 를 사용하는데... 이건 제가 해보지는 않았습니다. 기본적으로 VC++
을 위해서 만들어 논것인데 조금만 모디파이하면 될것 같기도 하구.... 보내드릴곳이 없군요..
이멜 적어놓으시면 자료 보내 드리지요...
-------------------------------------------------------------------------------------------
//mmTimers.h
#ifndef ___multimedia_timers___
#define ___multimedia_timers___
#include <mmsystem.h>
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
-------------------------------------------------------------------------------------------
//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;
}
|