2012-12-21 5 views
9

델파이 XE2 문서는 TEvent에 대해이 말한다 :TEvent가 설정되었음을 어떻게 감지합니까?

때때로, 당신은 스레드가 오히려 실행을 완료하기 위해 특정 스레드를 기다리는 것보다 몇 가지 작업을 완료 할 때까지 기다릴 필요가있다. 이렇게하려면 이벤트 객체를 사용하십시오. 이벤트 개체 (System.SyncObjs.TEvent)는 모든 스레드에서 볼 수있는 신호처럼 작동 할 수 있도록 전역 범위로 만들어야합니다.

스레드가 다른 스레드가 의존하는 작업을 완료하면 TEvent.SetEvent를 호출합니다. SetEvent는 신호를 켜기 때문에 검사를 수행하는 다른 스레드는 작업이 완료되었음을 알 수 있습니다. 신호를 끄려면 ResetEvent 메서드를 사용합니다.

예를 들어, 단일 스레드가 아닌 실행을 완료하기 위해 여러 스레드를 기다려야하는 상황을 고려해보십시오. 마지막으로 끝나는 스레드를 알지 못하기 때문에 스레드 중 하나의 WaitFor 메서드를 사용할 수 없습니다. 대신 각 스레드가 완료 될 때 카운터를 증가시키고 이벤트를 설정하여 마지막 스레드 신호를 모두 보냈 음을 알릴 수 있습니다.

그러나 다른 스레드가 TEvent.Set 이벤트가 호출되었음을 감지하는 방법은 Delphi 설명서에서 설명하지 않습니다. TEvent.Set이 호출되었는지 확인하는 방법을 설명해 주시겠습니까?

+2

왜 모든 스레드/이벤트가 신호를 받길 기다리지 마십시오. 왜 기다리는 것이 아니라 테스트할까요? –

+0

의견을 보내 주셔서 감사합니다. 여기서받은 도움에 대한 응답으로 이벤트 사실을 알리기 위해 코드를 프로그래밍했습니다. –

답변

11

이벤트가 신호되는지 여부를 테스트하려면 메서드를 호출하고 시간 제한 값을 0으로 전달하십시오. 이벤트가 설정된 경우 wrSignaled을 반환합니다. 그렇지 않은 경우 즉시 시간 초과되며 wrTimeout을 반환합니다. 예를 들어, 이벤트의 정상적인 사용은이 방식으로 시그널링되었는지 여부를 검사하는 것이 아니라 이벤트가 신호 될 때까지 현재 스레드를 블로킹하여 동기화하는 것입니다. 0이 아닌 값을 timeout 매개 변수에 전달하여 상수가 완료 될 때까지 상수 INFINITE을 입력하거나 그렇지 않을 때까지 기다리거나, 무기한으로 차단하지 않으려면 더 작은 값을 전달하여이 작업을 수행합니다 시간.

+0

일반적으로 'WaitFor'는 무한대 또는 작지만 0이 아닌 시간 초과와 함께 사용됩니다. – kludg

+2

@Serg : True. 그러나이 특정 경우에 단순히 설정했는지 여부를 확인하려는 경우에도이 방법으로 사용할 수 있습니다. –

관련 문제