VB.NET - Criando um cronômetro com stopwatch e Timer


Este artigo eu mostro como criar um cronômetro simples usando a classe StopWatch e o componente Timer.

Aproveitando o artigo eu também vou mostrar como realizar algumas tarefas básicas usando o VB .NET :

Então antes de iniciar a prática vamos falar um pouco da classe StopWatch.

A classe Stopwatch fornece um conjunto de métodos e propriedades que você pode usar para medir de uma maneira mais precisa o tempo transcorrido.

O classe Stopwatch  é muito útil para calcular o tempo que foi gasto entre dois intervalos de tempo em uma aplicação VB .NET.

Para usar o objeto Stopwatch   você precisa chamar o seu método Start para iniciar a contagem do tempo; o método Stop interrompe a contagem. O método Reset é útil para limpar a contagem do tempo iniciando o contador.

Temos a seguir a sequência das etapas usadas para usar esta classe:

'Primeiro você cria uma nova instância da classe
Dim cronometro As New Stopwatch

' Em seguida você inicia a contagem do tempo
cronometro.Start()

' Aguarda a realização da operação VB .NET

' Após o encerramento da tarefa você para a contagem do tempo
cronometro.Stop()

' Por último você exibe o tempo gasto para executar a tarefa em milisegundos
Debug.WriteLine(stopWatch.ElapsedMilliseconds.ToString)

Uma instância da classe StopWatch pode estar em execução (Running) ou parada (Stopped), para determinar o estado atual de uma instância StopWatch você usa o método IsRunning.

O tempo gasto pode ser consultado através das propriedades Elapsed, ElapsedMiliseconds ou ElapsedTicks, e isso pode ser feito enquando a instância estiver em execução ou parada.

O método Reset é usado para limpar o tempo gasto acumulado em uma instância existente da classe StopWatch.

Criando um Cronômetro

Para exemplificar a utilização da classe StopWatch vou criar um cronômetro simples usando o Visual Basic 2008 Express Edition.

Abra o VB 2008 Express Edition e crie um novo projeto do tipo Windows Forms com o nome cronometro;

A seguir inclua os seguintes componentes no formulário padrão form1.vb:

Agora defina as seguintes propriedades do formulário form1.vb:

Defina o seguinte leiaute no formulário:

1- Definindo um formulário elíptico

Para alterar o formato retangular padrão do formulário podemos usar o evento Paint do formulário e usando a classe Graphics criando um objeto pelo método CreateGraphics() para em seguida desenharmos uma elipse e preenchendo-a com uma cor definida.

   Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
        Dim gr As System.Drawing.Graphics = Me.CreateGraphics()

        ' preenche a elipse.
        gr.FillEllipse(System.Drawing.Brushes.Coral, 0, 0, _
            Me.ClientSize.Width - 5, _
            Me.ClientSize.Height - 5)
    End Sub

Obs: Para obter o efeito desejado a propriedade BorderStyle do formulário deve ser definida como None.

2- Usando o controle Timer

No evento Tick do controle Timer estamos verificando se existe uma instância da classe StopWatch em execução(Running), e, neste caso obtemos o tempo gasto e o colocamos em uma variável do tipo TimeSpan para em seguida exibir o resultado formatado em horas, minutos e segundos e milisegundos e exibimos os valores no DataGridView.

Private Sub Cronometro_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cronometro.Tick
        If crono.IsRunning Then
         'Coloca o tempo total na variável do tipo TimeSpan
            Dim ts As TimeSpan = crono.Elapsed

          ' Mostra a informação dividida em Horas, Minutos, Segundo e Milisegundos.
           Me.txtCronometro.Text = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10)
           'incluir a informação no DataGridView
           If lapAtiva Then
                  Me.dgvTempos.Rows.Add(Me.dgvTempos.Rows.Count, txtCronometro.Text)
                  lapAtiva = False
           End If
End If
End Sub

3- Iniciando o cronômetro

Para iniciar o cronômetro definimos o código abaixo no evento Click do botão Iniciar.

O código verifica se existe uma instância em execução da classe StopWatch e neste caso para a contagem de tempo da instância e altera as propriedades dos botões de comando, caso contrário, inicia a contagem de tempo;

 Private Sub btnIniciar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIniciar.Click
        If crono.IsRunning Then
            crono.Stop()
            btnIniciar.Text = "Iniciar"
            btnTempo.Text = "ReIniciar"
            btnSalvar.Enabled = True
            btnRemover.Enabled = True
        Else
            crono.Start()
            btnIniciar.Text = "Parar"
            btnTempo.Text = "Tempo"
            btnSalvar.Enabled = False
            btnRemover.Enabled = False
        End If
    End Sub

4- Obtendo uma tomada de tempo

No evento Click do botão Tempo, definimos o código abaixo onde alteramos a propriedade da variável lapAtiva para True de forma a exibir os dados no DatagridView através do evento Tick do controle Timer. Se a propriedade Text do botão for diferente de "Tempo" usamos a propriedade Reset() para limpar a contagem do tempo reiniciando o contador.

Private Sub btnTempo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTempo.Click
        If btnTempo.Text = "Tempo" Then
            If crono.IsRunning Then
                lapAtiva = True
            End If
        Else
            txtCronometro.Text = "00:00:00.00"
            btnTempo.Text = "Tempo"
            crono.Reset()
        End If
    End Sub

5- Salvando os dados do DataGridView em um arquivo texto

Podemos salvar os dados de tempos tomados e exibidos no DataGridView; para isso definimos a rotina salvaTempos() cujo código é mostrado a seguir.

Nele obtemos a data atual no formato longo e removemos os dois pontos para montar a variável caminho que define o caminho e nome do arquivo que será salvo. Dessa forma teremos arquivos com nomes distintos a cada tomada de tempo.

Em seguida criamos um objeto StreamWriter e percorrermos o DataGridView salvando os dados das duas células existentes.

Private Sub salvaTempos()
        Dim data As Date = Now
        Dim valor As String = data.ToLongTimeString.Replace(":", "")

        Dim caminho As String = "c:\dados\tempos" & valor & ".txt"

        Using writer As New StreamWriter(caminho)
            For Each row As DataGridViewRow In Me.dgvTempos.Rows
                writer.WriteLine(String.Format("{0},{1}", _
                row.Cells(0).Value, _
                row.Cells(1).Value))
            Next
        End Using

    End Sub

6- Limpando as linhas do DataGridView

Para limpar as linhas do DataGridView usamos o método Clear da classe Rows. Isso vai funcionar pois o nosso DataGridView esta sendo usando no modo não vinculado e não temos um datasource associado ao mesmo. O código é o seguinte:

Private Sub btnRemover_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRemover.Click
        dgvTempos.Rows.Clear()
    End Sub 

7- Salvando os dados do DataGridView

Para salvar os dados apenas chamamos a rotina salvaTempos() já definida no evento Click do botão Salvar:

Private Sub btnSalvar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalvar.Click
        salvaTempos()
    End Sub	

8- Encerrando a aplicação

Para encerrar basta definir o código abaixo no evento Click do botão Sair:

Private Sub btnSair_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSair.Click
        If MsgBox("Deseja encerrar ?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
            Close()
        End If
    End Sub

Executando o projeto e efetuando algumas tomadas de tempos teremos como resultado o formulário abaixo e o arquivo salvo com o nome tempos111321.txt, os tempos tomados sendo exibidos no bloco de notas:

Embora simples a aplicação apresenta alguns conceitos básicos e mostra como efetuar algumas tarefas envolvendo os controles Timer e DataGridView.

Eu sei é apenas VB .NET, mas eu gosto...

Referências:


José Carlos Macoratti