Pergunta

Eu estou usando um DispatcherTimer para realizar uma contagem regressiva antes de disparar a liberação em uma câmera. O método UpdateCountdown é usado para mudar a imagem exibida para o usuário antes que os fogos da câmara. Ao invés de ter o método TakePicture executar imediatamente, gostaria têm um ligeiro atraso após o contador atingir zero e a última imagem é exibida.

O código mostrado abaixo resulta na pausa que ocorrem no ponto de _countdown = 1. Enquanto a final imagem é exibida e incêndios TakePicture() quase simultaneamente (acho TakePicture ocorrer primeiro).

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

O que não estou levando em consideração com o meu tempo?

Foi útil?

Solução

Será que a interface do usuário não atualizar imediatamente quando você alterar as propriedades de controle - ele só atualiza quando o fio se torna ocioso (isto é, após todos os seus manipuladores de eventos concluir a execução)

.

blocos Thread.sleep o fio, os manipuladores de eventos não terminar execução e UI não é redesenhado.

Você tem que usar outro timer (iniciar um novo temporizador no último tick do temporizador existente e chamar TakePicture em carrapato teh novo temporizador) ou, melhor ainda, usar o último tick do temporizador existente - atualização UI quando (_countdown <= _countdownMax) , tirar uma foto quando (_countdown == _countdownMax + 1).

Outras dicas

Porque não basta fazer sua exposição sempre mostrar 1 a menos do que o número de segundos restantes. Dessa forma, quando você começa a zero, (obviamente com um Math.max (0, _countdown) para evitar mostrando -1) vai parecer que o tempo se esgotou, embora há mais de um segundo para ir.

Edit: O que eu quis dar a entender, mas não fez estado - era que você poderia, então, só tem um manipulador Tick e não usam a latência em tudo que só vai acabar bloqueando a de qualquer maneira UI que provavelmente bloquear o seu UI de atualização.

Eu não acho que os eventos de garantir que os manipuladores de eventos são acionados na ordem em que eles são registrados. Tentar

_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();
        }
      });
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top