none
Cronômetro RRS feed

  • Pergunta

  • Boa tarde!

    Como crio um cronômetro usando a classe StopWatch()?

    Fiz o código abaixo mas o tempo só atualiza aparece quando eu clico no botão:

    private void button1_Click(object sender, EventArgs e)
            {
                stopWatch.Start();

                TimeSpan ts = stopWatch.Elapsed;

                string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                    ts.Hours, ts.Minutes, ts.Seconds,
                    ts.Milliseconds / 10);

                lbCronometro.Text = elapsedTime;
            }

    Eu preciso que o cronômetro seja mostrado em tempo real e que eu consiga registrar o tempo ao clicar, por exemplo, em um botão "Registrar".

    Obrigado.

    quinta-feira, 8 de março de 2018 18:07

Respostas

  • Olá bom dia,

    Uma solução simples seria:

    Existe um componente no WinForms "Timer" (System.Windows.Form.Timer) veja:

    1° Crie dois TextBox com o nome "segundo" e "minuto", com o valor "0";

    2°Adicione o componente Timer ao Form.

    3° No componente Timer, altere a propriedade "Intervalde 100 para "1000" (milisegundos), e adicione o evento "Tick", com o código abaixo:

       private void timer1_Tick(object sender, EventArgs e)
            {
                int _segundo = int.Parse(segundo.Text);
                segundo.Text = (_segundo < 59) ? (_segundo + 1).ToString() : "0";
                if (_segundo >= 59)
                {
                    int _minuto = int.Parse(minuto.Text);
                    minuto.Text = (_minuto < 59) ? (_minuto + 1).ToString() : "0";
                }
            }

      4º Crie dois botoes "inicio" e "Reset" com os eventos:

    private void btnStartTimer_Click(object sender, EventArgs e) { this.timer1.Start(); } private void btnReset_Click(object sender, EventArgs e) { this.timer1.Stop();

    this.segundo.Text = "0"; this.minuto.Text = "0"; }


    Pronto! Cronômetro funcionando!

    Espero ter ajudado!

    Um abraço!






    sexta-feira, 9 de março de 2018 13:53

Todas as Respostas

  • Olá,

    veja se este link te ajuda.

    https://social.msdn.microsoft.com/Forums/vstudio/en-US/17f29189-0701-4dcb-a3e2-7cf053bb507a/change-labels-text-in-real-time?forum=csharpgeneral

    https://www.dotnetheaven.com/article/how-to-create-stopwatch-in-csharp

    Abs!


    Leandro de Agostini MCTS - Web Application, Framework 4


    quinta-feira, 8 de março de 2018 21:09
  • Note que você só está atualizando a sua TextBox quando o botão é clicado. Para ver o tempo decorrido em tempo real, o correto seria performar a ação a todo momento. Infelizmente, a classe System.Diagnostics.Stopwatch não tem nenhum evento pra notificar alguma atualização no objeto.

    Nesse caso, uma alternativa seria usar um Timer. A classe System.Timers.Timer tem o evento Elapsed, que é chamado a cada Tick do Timer.

    Veja o código:

    Stopwatch stopwatch = new Stopwatch();
    Timer timer = new Timer(1); // Setando o intervalo para 1 ms.
    
    timer.Elapsed += UpdateTextBox;
    
    void UpdateTextBox(Object sender, ElapsedEventArgs e)
    {
        TimeSpan ts = stopwatch.Elapsed;
        textBox.Text = String.Format("{0:00}:{1:00}:{2:00}:{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
    }
    

    No exemplo acima, você pode manter seu código usando o Stopwatch. Nele, você só vai criar um método que o Timer vai chamar a cada 1 milissegundo. É nele que você atualizará o texto da TextBox com o tempo do Stopwatch.

    Quanto ao sistema de registrar o tempo, você pode usar uma ListBox para exibir ao usuário os tempos marcados:

    // Este é o evento que você vai chamar
    // quanto o usuário quiser marcar o tempo.
    // Através de um botão, por exemplo.
    void RegisterTime(Object sender, EventArgs e)
    {
        TimeSpan ts = stopwatch.Elapsed;
        string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}:{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
        listBox.Items.Add(elapsedTime);
    }

    Toda vez que o método RegisterTime for chamado, ele pegará o tempo atual do Stopwatch (o mesmo que está sendo exibido em tempo real na TextBox), e adicionará à ListBox como um novo Item.

    Veja se isso te ajuda.

    quinta-feira, 8 de março de 2018 22:08
  • Olá bom dia,

    Uma solução simples seria:

    Existe um componente no WinForms "Timer" (System.Windows.Form.Timer) veja:

    1° Crie dois TextBox com o nome "segundo" e "minuto", com o valor "0";

    2°Adicione o componente Timer ao Form.

    3° No componente Timer, altere a propriedade "Intervalde 100 para "1000" (milisegundos), e adicione o evento "Tick", com o código abaixo:

       private void timer1_Tick(object sender, EventArgs e)
            {
                int _segundo = int.Parse(segundo.Text);
                segundo.Text = (_segundo < 59) ? (_segundo + 1).ToString() : "0";
                if (_segundo >= 59)
                {
                    int _minuto = int.Parse(minuto.Text);
                    minuto.Text = (_minuto < 59) ? (_minuto + 1).ToString() : "0";
                }
            }

      4º Crie dois botoes "inicio" e "Reset" com os eventos:

    private void btnStartTimer_Click(object sender, EventArgs e) { this.timer1.Start(); } private void btnReset_Click(object sender, EventArgs e) { this.timer1.Stop();

    this.segundo.Text = "0"; this.minuto.Text = "0"; }


    Pronto! Cronômetro funcionando!

    Espero ter ajudado!

    Um abraço!






    sexta-feira, 9 de março de 2018 13:53