앞에서 말한 Timer는 일반적으로 말하는 API 타이머로...
이거는 별로 신뢰성이 없지요..
특히 최대 빈도수가 초당18번(약55ms)밖에 안되는데다가...
여러가지 Task를 하게되면 그시간이 영향을 받게 되고..
그래서 더 빠르고 정확한 시간을 얻기위해..
멀티미디어 타이머를 사용합니다..
밑에 보시면 알겠지만.. 멀티미디어 타이머는
CPU의 리소르를 많이 잡아먹기 때문에...
한 프로그램에서 되도록이면, 여러개를 쓰지않는것이 좋습니다.
그리고 제가 이 타이머로 신호를 프린트포트로 보내서..
오실로 스코프로 찍어 보았는데...
10msec에서는 정확하게 나왔는데...
그 이하로 내려가면 정확한 신호가 나오지 않더군요...헐...
아무튼 10ms는 믿을만한 성능을 얻을수 있을 겁니다.
그리고 멀티미디어 타이머 컴포넌트가 나와 있는것이 있는데..
여기서도 봤던거 같은데..훔...
제 홈피의 자료실에가시면 받으실수 있습니다.(www.newsm5.com)
아래는 멀티미디어 타이머에 대한 퍼온글입니다..
++++++++++++++++++++++++++++++++++++++++++++++
3. 멀티미디어 타이머
1> 멀티미디어 타이머의 개요
전술한 API 표준 타이머는 메세지 방식의 우선 순위 때문에 정교한 제어를 위해
서는 별로 유용하지 못하다. 게다가 최대 빈도수가 초당 18 타임이기 때문에 그보
다 더 정확한 1/1000 초를 제어할 수 있는 타이머가 요구되어 졌는데 그것이 바로
이 멀티미디어 타이머이다. 이것은 MIDI 시퀀스 장치 또는 다른 전문 하드웨어에
대한 MIDI 이벤트 제어처럼 애플리케이션의 정확한 타이밍을 요구할 때 사용되어
진다.
이 멀티미디어 타이머가 API 타이머와 다른 점이라면 Timer Event Callback
Notification 메커니즘이라는 것이다. ( API 타이머는 애플리케이션 메세지 큐에
WM_TIMER 삽입 )
2> 함수 요약
timeGetDevCaps 타이머가 지원하는 최소 최대 해상도를 알아낸다.
timeBeginPeriod 최소의 타이머 해상도를 결정한다.
timeEndPeriod timeBeginPeriod 에 의해 만들어진 타이머 해상도를 제거
한다.
timeSetEvent 타이머 이벤트를 시작하고 간격에 따라 콜백 함수를 호출
한다.
timeKillEvent 타이머 이벤트를 끝낸다.
여기서 timeBeginPeriod 에 의해 넘겨지는 밀리 초 단위의 최소 타이머 해상도는
그 해상도에 대한 ID 처럼 생각할 수 있으며 timeEndPeriod 에 의해 제거 될 때도
그 최소 해상도를 넘겨 주어야 제거 가능하다. timeSetEvent 로 타이머 이벤트를
시작하기 전에 항상 최소 타이머 해상도가 정해져야 하며 타이머 이벤트가
timeKillEvent 로 제가 된 후에는 항상 제거 되어져야 한다.
또, 정확한 밀리 초 단위의 시간을 얻고자 할 때는 timeGetSystemTime 과
timeGetTime 을 사용하면 되는데 이 두개의 함수는 API 타이머에서 같은 기능을
하는 GetTickCount() 나 GetCurrentTime() 와는 달리 실질적인 밀리 초 정보를 제
공한다.
3> 멀티미디어 타이머의 단점
이것은 상당히 정확한 이벤트를 제공하는 반면에 그 만큼 시스템에 많은 부담을
주게 되므로 여러 개의 타이머를 동시에 돌리기에는 많은 시스템의 부하가 따른
다.
또 하나의 문제는 콜백 함수의 제한성에 있다. API 타이머의 콜백 함수는 일반
메세지와 같이 처리 되기 때문에 아무런 제약이 없었으나 멀티미디어 타이머에서
는 콜백 함수 내에서 사용할 수 있는 함수가 정해져 있고, 정해진 함수 이외의 사
용자 함수나 API 등을 호출하면 예측할 수 없는 결과를 초래하게 된다. 정해진 함
수란, PostMessage(), timeGetSystemTime(), timeGetTime(), timeSetEvent(),
timeKillEvent(), midiOutShortMessage(), midiOutLongMessage(),
OutputDebugString() 이 전부이다. PostMessage()와 OutputDebugString() 을 제
외하고는 모두 멀티미디어 함수들 뿐이다. 즉, 멀티미디어 용도 외에 타이머를 사
용하려면 모두 PostMessage()를 사용하여 다시 메세지를 발생해야 하는 것이다. (
API 타이머 보다야 빠르겠지만 대단한 클럭 낭비다. )
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|