2009-12-08 76 views
0

我正在使用DispatcherTimer在觸發攝像機上的釋放之前執行倒計時。方法UpdateCountdown用於在相機觸發之前更改顯示給用戶的圖像。方法不是立即執行TakePicture方法,而是在計數器達到零並顯示最後一個圖像後,我想稍微延遲一點。如何在倒數計時器後添加延遲

下面顯示的代碼導致暫停發生在_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),或者甚至更好地使用現有計時器的最後一個計時器 - 更新UI (_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 2009-12-09 14:16:50

1

爲什麼不讓顯示屏始終顯示1小於剩餘秒數?這樣,當你達到零時(顯然用Math.Max(0,_countdown)來防止顯示-1),看起來時間已經用盡,即使還有一秒鐘的時間。

編輯:我的意思暗示,但沒有狀態 - 是,然後你可以只是一個節拍處理,並在所有這將只是風反正阻塞UI,這將可能是由阻止你的用戶界面不使用的睡眠更新。

+0

這實際上是我目前的解決方案(未顯示),但我希望能夠將延遲調整爲小於完整的刻度。 – pdemarest 2009-12-08 05:14:49