|
하시려는 정확한 의도가 무엇인지 잘 모르겠네요.
다만 지연시키는 것에 대해서 이해를 돕고자 합니다.
Sleep()은 현재 동작하는 Thread를 멈춥니다.
만약 Timer함수에서(폼에 타이머 컨트롤을 가져다가 더블클릭해서 만든함수)
Sleep()을 사용하면 당연하게도 Main Thread에서 Sleep이 일어났기 때문에
Main Thread 전체가 멈추는 효과가 있게 됩니다.
따라서 어떤 이벤트도 받을 수 없는 것은 당연합니다.
Sleep은 Thread를 따로 만들어서 사용하지 않는 한 거의 쓸모가 없을 겁니다.
그렇다면 어떻게 지연을 할 것인가?
여기에는 각자의 트릭이 있을 수 있을 겁니다.
일을 시켜보면 '지연'을 다음과 같이 해오는 사람들이 있어서 매번 지적합니다.
1. while문을 만들고 대기한다. ^^;;
간단하기는 하지만 dead lock의 위험과 역시 다른 작업은 불가능한 문제가 있습니다.
(*)
2. while문을 만들고 시간을 측정하면서 Appication->ProcessMessage();로 다른 이벤트
를 받아온다.
약간 나아지기는 했지만 오히려 Stack Overflow나 재귀 호출 효과 같은 찾기 어려운 문제를
야기시키기도 합니다.
(**)
3. Member변수를 만들어서 해당 변수조건에서 시간을 체크하게해서 대기합니다.
즉 타이머에 Step을 만들어서 각 Step으로 처리하는 방법입니다.
많이 좋아지기는 했습니다. 하지만 시간 체크하고 Interval을 변화시키는 부분이 불편합니다.
(****)
4. Thread로 따로 빼서 Process를 구현하고 필요에 따라서 Sleep을 사용합니다.
상당히 훌륭하기는 한데, 화면 Display는 따로 하던지 UI component는
동기화해야 합니다. Thread를 생성하고 소멸할 때 주의를 기울여야합니다.
(****)
개인적으로는 GetTickCount()는 API함수를 이용해서 시작 시점을 받아둡니다.
그리고 현재시간과 시작 시점의 차를 이용합니다.
차의 값이 원하는 값 이하이면 return을 합니다, 다른 Timer나 이벤트, Thread에 기회를
넘겨주는 거죠.
어찌보면 3번 방법의 다른 형태입니다.
GetTickCount()함수의 Y2K버그는 차가 음수가 되면 보정해주어야 합니다.
회사에 간단하게 만든 class가 있기는 한데...
일하는 사람이라 길게 자세히 설명 못드려서 죄송하네요. ^^;;
지금 시작 님이 쓰신 글 :
: 안녕하세요~
:
: 제가 전류 메타로부터 전류를 읽어 들이는 프로그램을 하고 잇습니다.
:
: 이때 전류 메타가 시리얼 통신으로 타이머를 돌리면서 계속 값을 읽어 뿌려주고 있는데요
:
: 헌데 전류메타가 전류를 읽는데 시간이 필요해서 딜레이를 주려고 합니다.
:
: 그래서 sleep()과 delay()함수중에 하나를 사용해서 딜레이를 주었는데
:
: 이 딜레이되는동안 타이머가 동작을 하지 않는군요....
:
: 즉 딜레이를 주긴하지만 타이머는 그대로 계속 동작을 시키고 싶습니다.
:
: 방법이 있을까요? 쓰레드로 타이머를 돌리면 가능할 것 같은대 쓰레드는 한번도 안써봐서...
:
: 혹시 더 간단한 방법을 알고 계시면 알려주시고 아니면 쓰레드를 사용하여 해당 타이머함수를 돌리는 방법이라도
:
: 알려주시면 감사하겠습니다 ㅠ.ㅠ
:
: 염치없지만 답변 부탁드릴께요...
|