Frage

Ich bin mit einem DispatcherTimer einem vor dem Auslösen die Veröffentlichung auf einer Kamera Countdown durchzuführen. Die UpdateCountdown Verfahren wird verwendet, um das Bild an den Benutzer, bevor die Kamera ausgelöst angezeigt zu ändern. Anstatt die TakePicture Methode sofort auszuführen, würde Ich mag eine leichte Verzögerung, nachdem der Zähler Null erreicht und das letzte Bild angezeigt wird.

Der folgende Code führt zur Pause gezeigt am _countdown = 1 Punkt auftritt. Während das endgültige Bild zeigt und TakePicture() Brände fast gleichzeitig (ich glaube, TakePicture geschieht zuerst).

_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;
      }

Was bin ich nicht in Betracht mit meinem Timing zu nehmen?

War es hilfreich?

Lösung

Die Benutzeroberfläche wird nicht sofort aktualisiert, wenn Sie die Kontrolle Eigenschaften ändern - es ist nur aktualisiert, wenn der Thread frei wird (das heißt, nachdem alle Ihre Event-Handler beenden Ausführung)

.

Thread.Sleep blockiert den Thread, die Ereignishandler nicht beenden Ausführung und UI ist nicht neu gezeichnet.

Sie müssen entweder einen anderen Timer verwenden (einen neuen Timer auf dem letzten Tick des vorhandenen Timer starten und Takepicture rufen teh Zecke neuen Timer) oder, noch besser, verwenden Sie den letzten Tick des bestehenden Timer - Update UI wenn (_countdown <= _countdownMax) nehmen, Bild, wenn (_countdown == _countdownMax + 1).

Andere Tipps

Warum nicht nur Ihre Anzeige machen zeigt immer 1 kleiner als die Anzahl der verbleibenden Sekunden. Auf diese Weise, wenn Sie auf Null bekommen, (natürlich mit einem Math.max (0, _countdown) -1 zu verhindern zeigt) wird es wie die Zeit scheint sogar abgelaufen obwohl man sich mehr an zweite Stelle zu gehen.

Edit: Was ich implizieren, aber nicht Staat - war, dass man konnte dann nur noch ein Handler Tick und Schlaf nicht verwenden, die die UI einfach aufzuwickeln wird blockiert sowieso die wahrscheinlich blockieren die Benutzeroberfläche aus zu aktualisieren.

Ich glaube nicht, dass die Ereignisse garantieren, dass Event-Handler in der Reihenfolge ausgelöst werden, dass sie registriert sind. Versuchen

_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();
        }
      });
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top