2009-12-08 5 views
0

카메라의 릴리스를 트리거하기 전에 DispatcherTimer을 사용하여 카운트 다운을 수행하고 있습니다. UpdateCountdown 메서드는 카메라가 작동하기 전에 사용자에게 표시되는 이미지를 변경하는 데 사용됩니다. TakePicture 메서드를 즉시 실행하는 대신 카운터가 0에 도달하고 마지막 이미지가 표시된 후 약간의 지연이 필요합니다.카운트 다운 타이머 이후에 지연을 추가하는 방법

아래 표시된 코드는 _countdown = 1 지점에서 일시 중지가 발생합니다. 최종 이미지가 표시되고 TakePicture()이 거의 동시에 발생하는 동안 (나는 TakePicture이 먼저 발생한다고 생각합니다).

_countdownTimer = new DispatcherTimer(); 
_countdownTimer.Interval = TimeSpan.FromSeconds(1); 
_countdownTimer.Tick += new EventHandler(delegate(object s, EventArgs a) 
    { UpdateCountdown(); }); 

_countdownTimer.Tick += new EventHandler(delegate(object s, EventArgs a) 
    {if (_countdown == _countdownMax) 
     { 
      System.Threading.Thread.Sleep(2000); // Slight delay before taking picture 
      Camera.TakePicture(); 
     } }); 
    } 

public void StartCountdown() 
{ 
    if (doCount) 
    { 
     doCount = false; 
     UpdateCountdown(); 
     _countdownTimer.Start(); 
    } 
} 

private void UpdateCountdown() 
{ 
    _countdown--; 
    CountdownImage = _countDownImages[_countdown]; // Data bound to Image Control 

    if (_countdown == 0) 
    { 
     _countdown = _countdownMax; 
     _countdownTimer.Stop(); 
     doCount = true; 
     } 

타이밍에 대해서는 어떻게 생각하지 않습니까?

답변

2

컨트롤 속성을 변경하면 UI가 즉시 업데이트되지 않습니다. 스레드가 유휴 상태가 될 때 (즉, 모든 이벤트 처리기가 실행을 마친 후)에만 업데이트됩니다.

Thread.Sleep이 스레드를 차단하고 이벤트 처리기가 실행을 완료하지 않으며 UI가 다시 그려지지 않습니다.

다른 타이머 (기존 타이머의 마지막 틱에서 새 타이머를 시작하고 새 타이머 틱에서 TakePicture를 호출)를 사용하거나 기존 타이머의 마지막 틱을 사용하는 것이 좋습니다. (_countdown <= _countdownMax), (_countdown == _countdownMax + 1) 일 때 사진 촬영.

0

이벤트 처리기가 등록 된 순서대로 트리거된다는 것을 이벤트가 보장한다고 생각하지 않습니다. 시도해보십시오.

_countdownTimer.Tick += new EventHandler(delegate(object s, EventArgs a)  
{ 
     UpdateCountdown(); 
     if (_countdown == _countdownMax) 
     { 
      System.Threading.Thread.Sleep(2000); // Slight delay before taking picture 
      Camera.TakePicture(); 
     } 
     }); 
    } 
+0

좋은 지적으로, 나는이 구성으로 시작했다고 생각합니다. – pdemarest

1

디스플레이가 항상 남은 시간보다 1 초 이상 표시되지 않는 이유는 무엇입니까? 그렇게하면 0이됩니다. (명백하게 -1을 표시하지 않으려면 Math.Max ​​(0, _countdown)을 사용합니다.) 갈 시간이 하나 더 있더라도 시간이 다 된 것처럼 보입니다.

편집 : 내가 암시하기를 의도했지만 의미하지 않은 것은 - 그렇습니다. 똑딱 처리기를 사용하지 않아 UI가 차단되어 UI를 차단할 수 있습니다. 업데이트 중.

+0

이것이 본질적으로 현재의 솔루션입니다 (표시되지 않음).하지만 지연을 전체 틱보다 작게 조정할 수 있기를 희망했습니다. – pdemarest