C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[3769] Re:NT 나 Multimedia Timer 를 사용해 보세요..
향기 [] 5021 읽음    2000-07-19 00:00
일반적으로 윈도우 타이머는 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;
}

+ -

관련 글 리스트
3768 50msec 이내로 클럭 event 발생시키는 방법 정준하 3853 2000/07/19
3769     Re:NT 나 Multimedia Timer 를 사용해 보세요.. 향기 5021 2000/07/19
3784         Re:Re: 상세한 답변과 email까지... 정말 감사합니다. 정준하 3763 2000/07/21
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.