2011-11-04 5 views
0

.Net4.0에서 C++ CLI를 사용하여 응용 프로그램을 코딩하고 있습니다. 임의의 시간에 발생시킬 수있는 이벤트에 대한 이벤트 처리기가 있습니다. 이벤트는 특정 시간 프레임 내에 발생하는 경우에만 유용합니다. 한 번에 한 번 발생해야 함) 이벤트가 과거 간격으로 한 번 올랐는지 확인해야합니다. 특정 시간 간격으로 제기하지 않은 경우 예외가 발생합니다. 나는 이런 식으로 구현 시도특정 시간 내에 이벤트가 발생했는지 확인하는 방법은 무엇입니까?

:

  1. 클래스 이벤트 핸들러에서
  2. 에 부울 플래그 변수를 추가,
  3. 은 내가이있는 검사를 수행하려면 = true로 플래그를 설정 타이머 이벤트 :이 경우 타이머 이벤트가 이비 200 밀리 발생
  4. 그것은 플래그는
  5. 사실 여부 검사 이 카운터가 한계에 도달하면 플래그는 카운터
  6. 를 증가 거짓임을 알면은 0
  7. 타이머 이벤트에 대한 카운터 설정 사실 는 (예를 들어 3 개) 다음 거짓
  8. 에 플래그를 설정 예외를 throw합니다.

그러나 오탐 (false positives)을 발견했습니다. Thios는 이벤트가 차단 되었기 때문에 발생합니다.

누구나 더 좋은 방법을 알고 있습니까? 나는 외부 타이머 이벤트 (또는 스레드)없이 다른 스레드를 인터럽트 할 수있는 방법이 있는지 알고 싶습니다.

미리 감사드립니다.

+0

내 의견을 도울 수 있는지 잘 모르겠지만 생성자에서 static 플래그가있는'static' 검사기 클래스의 개체를 만들려면 이벤트 처리기를 만들려고 했습니까? 각 객체 생성 프로세스는 정적 플래그를 증가시킵니다. 그런 다음 플래그의 값과 시간 프레임을 비교할 수 있습니다. – Aan

답변

0

당신의 C++ CLI 만의 의미의 확실하지 내가 단위 테스트 비동기 이벤트는 C#으로 나는 보통 할 때 :

[Test] 
    public void CheckThatEventIsRaisedWithinTimeframe() 
    { 
     var eventRaised = new ManualResetEvent(false); 
     subject.SomeEvent += (s, e) => { eventRaised.Set(); }; 

     // Do something which should have triggered the event 

     Assert.True(eventRaised.WaitOne(5000), "Event was not raised."); 
    } 

시간 중이 다 할 때까지 WaitOne 호출이 차단됩니다 (의 이 경우 5 초) 또는 이벤트가 발생합니다. 첫 번째 경우 WaitOne은 false를 반환하고 두 번째 경우에는 true를 반환합니다.

var eventRaised = new AutoResetEvent(false); 
subject.SomeEvent += (s, e) => { eventRaised.Set(); }; 

while(true) 
{ 
    var ok = eventRaised.WaitOne(5000); 
    if(!ok) 
     throw new Exception("Event was not raised for 5 seconds"); 
} 

이 실행 상태로 유지하고 이벤트가 적어도 5 초마다 발생하지 않은 경우 예외를 throw해야합니다

난 당신이 예를 들어 유사한 무언가를 할 수있는 가정합니다.

관련 문제