|
답변 감사드립니다. ㅡ0ㅡ;;
ㅅ 님이 쓰신 글 :
: 쩡이 님이 쓰신 글 :
: : 멀티미디어 타이머에 대해 몇가지 질문드립니다.
: : 멀티미디어 타이머의 생성/실행은 잘 됩니다.
: :
: : 타이머의 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();
: }
: }
|