|
쩡이 님이 쓰신 글 :
: 멀티미디어 타이머에 대해 몇가지 질문드립니다.
: 멀티미디어 타이머의 생성/실행은 잘 됩니다.
:
: 타이머의 Interval 보다 타이머 내의 처리 시간이 더 걸려도
: 일반 타이머와 마찬가지로 중복 실행되지는 않아보입니다. (확실하진 않아요..)
:
: 그런데..
: 디버깅 중, 브레이크 포인트를 잡았을 때, 멈춰있던 시간만큼
: 쌓여있던 타이머 이벤트가 한꺼번에 밀려오면서 PC가 한동안 먹통이 되네요..
: 이걸 막을 방법이 있을까요??
:
: //타이머 콜백 함수
: void CALLBACK TimeProcess(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
: {
: static bool bProcCheck1= true;
:
: if(bProcCheck1) {
: bProcCheck1= false;
:
: Form1->TimerProcEvent(); //타이머에서 처리할 내용..
:
: bProcCheck1= true;
: }
: else {
: iProcOver1++; //타이머 이벤트가 끝나기 전에 다시 실행이 될 때..
: return;
: }
: }
:
: 이렇게 처리할려고 하는데.. else 문으로 들어오지도 않습니다.
:
: 그리고..
: 멀티미디어 타이머 관련 함수 이외의 함수 사용 시에는 PostMessage()를 사용하라는데,
: vcl 관련(Label이나 Edit 등등..)된 것 말고는 직접 사용해도 문제 없어보이는데요..
: 이 부분에 대해 좀 더 설명 부탁드립니다.
아래는 타이머가 하나라는 가정하에 검사하는 예입니다.
UINT g_TimerId=0;
UINT g_Delay=100;
UINT g_Resolution=10;
DWORD g_LastTimeCalled=0;
void CALLBACK TimeProc(UINT uID,UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
DWORD ct = timeGetTime();
DWORD elapsed = ct - g_LastTimeCalled;
DWORD pat = g_Resolution*2 + 10;
g_LastTimeCalled = ct;
if(elapsed>g_Delay-pat && elapsed<g_Delay+pat){
//이곳은 아마도 타이머 이벤트에 상응하여 제대로된 간격으로 이 콜백함수가 호출될 때 진입할 것임.
}else{
//이곳은 브레이크 걸려서 밀려있던 이 콜백함수 호출이 g_Delay 무시하고 마구 쏟아져 들어올 때 진입할 것임.
// 이러한 호출을 무시하려면 그냥 return 하면 될 것으로 보임
}
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(g_TimerId==0){
g_TimerId = timeSetEvent(g_Delay,g_Resolution,(LPTIMECALLBACK)TimeProc,0,TIME_PERIODIC);
g_LastTimeCalled = timeGetTime();
}
}
|