|
향기 님이 쓰신 글 :
: 일반적으로 윈도우 타이머는 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;
: }
:
|