Pergunta

Eu tenho um recurso de relógio em um programa VB.NET que exibe o tempo incluindo os segundos. Eu tenho atualmente um temporizador constantemente polling usando agora. Eu tenho que consultar o relógio do sistema, muitas vezes porque eu preciso ter a segunda atualização em sincronia com o relógio do sistema.

Existe uma mais direta para acessar o tempo somente quando a mudança segundos?

Existe uma maneira mais eficiente de escrever esse código?

Se você precisar de mais informações deixe-me saber.

Foi útil?

Solução

Por que não usar o componente timer? Isso pressupõe que você estiver usando uma GUI e não a construção de um serviço.

Você pode chamar uma rotina de sincronização que realizou a pesquisa para obter o temporizador muito perto dos segundos mudando, então delegar o temporizador. Você poderia chamar a rotina de sincronização uma vez por minuto ou mais para se certificar de que você não está recebendo qualquer desvio OS.

Dito isto, estou certo que há uma maneira de detectar os segundos mudando evento, eu só não sei como fazê-lo.

Update:

Este link tem uma implementação semelhante ao que eu estava imaginando. Apenas modificá-lo para que você não está permanentemente preso em um loop e voila! Você tem sua rotina de sincronização.

Update 2:

Com base no feedback dos Shog9, eu acho que isso pode ser uma abordagem melhor do que polling:

Public Class Form1
   Private WithEvents clockTimer As New Timer
   Private currentTime As DateTime = DateTime.MinValue

   Private Sub ClockTick(ByVal sender As Object, _
      ByVal e As System.EventArgs) Handles clockTimer.Tick

      UpdateTimer()
      DisplayTimer()
   End Sub

   Private Sub UpdateTimer()
      currentTime = DateTime.Now

      clockTimer.Stop()
      clockTimer.Interval = 1000 - currentTime.Millisecond
      clockTimer.Start()
   End Sub

   Private Sub DisplayTimer()
      lblTime.Text = currentTime.ToString("T")
   End Sub

   Private Sub Form1_Load(ByVal sender As System.Object, _
      ByVal e As System.EventArgs) Handles MyBase.Load

      UpdateTimer()
      DisplayTimer()
   End Sub
End Class

Agora, com base em meus testes preliminares, há algum tipo de deriva com cada evento Tick. Na minha máquina, variou entre 12 e 20 milissegundos. Se alguém tem uma idéia sobre como corrigir de forma confiável a deriva, eu estaria interessado em aprender.

Outras dicas

Use um objeto Timer, configurá-lo de "intervalo" para 0, defina-o de "habilitado" para true. Isso irá disparar aproximadamente a cada 15 milissegundos (com base na configuração de hardware). Nesse método, conjunto MyLabel.Text = DateTime.Now.ToString () (ou o que você está fazendo).

Isso é perfeitamente performance.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top