|
일반적으로 한 루틴을 수행할 때, 그 프로그램의 루틴은 쓰레드를 제외하곤 수행을 멈추게 됩니다.
While(true) {}
이 루틴을 실행시켜 보면, 프로그램이 죽어버릴 정도로 멈춰 있는 경우가 발생합니다. 하지만, Application->ProcessMessages() 메소드는 밀린 처리를 함께 처리합니다. 따라서...
While(true) {
Application->ProcessMessages();
}
위 루프는 While 에서 무한 루프가 돌고 있지만, 모든 컨트롤 처리나 이벤트가 동작합니다.
이 예제로 말씀드리고 싶은 건, 타이머 이벤트는 일반적으로 이벤트 루틴이 실행되는 중간에 끝나지도 않았는데 다시 타이머 Tick이 동작해 이벤트 루틴이 중복 병행되어 수행되지는 않는다는 점입니다. 하지만 ProcessMessages를 사용할 경우, 위의 상황이 발생합니다.
실질적으로 1/1000 초 이벤트를 발생시킨다 하더라도, 연산만 몇번 해도 이 이벤트 Tick 에 차이가 납니다. 하지만, ProcessMessages 가 없는 이상 중복되어 처리되지는 않겠죠. 사실상, 이것도 좋은 방법도 아닙니다. 몇몇 컨트롤은 자신의 기능을 위해 처리를 강제적으로 뿌려버리는 경우가 있습니다. Indy의 AntiFreeze 같은 컨트롤은 계속하여 ProcessMessages를 발생합니다. 따라서 프로그래밍의 순서도 상당히 복잡히 생각해 보아야 합니다.
가장 안전한 방법은, 타이머에 들어왔을때, 타이머를 Suspend 시키는 겁니다. 그 다음, 실행이 모두 끝나거나 중간에 Return 될 때, 다시 Resume 시켜 타이머의 동작을 활성화 시키는 방법입니다.
루틴의 수행 시간은 루틴이 시작할때 시간을 알아보고, 끝날때 시간을 알아서 빼면 되지만, 이 방법으로 루틴의 속도를 정의하기는 힘듭니다. 각 사용자의 CPU와 RAM, 동작하는 프로그램 갯수에 따라 이 시간은 바뀔텐데, 한 컴퓨터에서 테스트한 값을 여러 사용자에게 적용하는건 아무래도 무리가 있겠죠.
김진수 님이 쓰신 글 :
: 1/1000 초 마다 이벤트가 걸린다면 그안에서 처리되는 루틴이 1/1000을 만약 넘게 된다면(어떻게
:
: 알지 모르지만?) 그럼 어떻게 되버리는건가요?
:
: 1/1000을 넘지 않는지 알아볼 방법은 있는 건인지 궁금합니다.
:
:
: 유영인 [Chris] 님이 쓰신 글 :
: : 보통의 타이머는 Tick이 0.58(가물가물 -_-+) 정도기 때문에, 정확한 시간을 체크하기 어렵습니다. 타이머가 1/1000 초로 Interval을 잡을 수 있다고 해도 실제로 정확한 연산이 나오지 않죠. 하지만 윈도우 미디어 플레이어가 사용하는 DLL을 이용하면 1/1000초의 정확한 계산을 할 수 있습니다. 이것이 바로 멀티미디어 타이머고요, 지금은 API화 되어 있습니다.
: :
: : int A = timeGetTime();
: :
: : 이런식으로 호출하시면, A에 현재의 시간이 밀리세컨드까지 정수화 되어 표기 됩니다. 이 말씀은 1000 단위가 1초가 된다는 뜻입니다. 보통의 Sleep 명령은 Sleep(7) 이런식으로 지연시킬 수 없습니다. 그렇기 때문에 아래와 같은 루틴을 사용하는 것이죠.
: :
: : 사용 방법은 ..
: :
: : #include <mmsystem.h>
: :
: : 을 추가시켜 주시면 일반 함수처럼 사용하실 수 있습니다. mmsystem.h 에는 timeSetEvent 라는 함수도 포함이 되어있는데, 이 함수를 이용하시면 1/1000초라는 Interval을 가질 수 있는 타이머를 만드실 수 있습니다.
: :
:
|