2

我在 VB.NET 程序中有一个时钟功能,可以显示包括秒在内的时间。我目前有一个使用 NOW 不断轮询的计时器。我必须经常轮询系统时钟,因为我需要让第二次更新与系统时钟同步。

只有当秒数变化时,是否有更直接的访问时间?

有没有更有效的方法来编写这段代码?

如果您需要更多信息,请告诉我。

4

2 回答 2

5

为什么不使用计时器组件?这假设您使用的是 GUI 而不是构建服务。

您可以调用执行轮询的同步例程以使计时器非常接近秒数的变化,然后委托给计时器。您可以每分钟左右调用一次同步例程,以确保您没有得到任何操作系统漂移。

话虽如此,我确信有一种方法可以检测秒变化事件,我只是不知道该怎么做。

更新:

此链接的实现类似于我的设想。只需修改它,这样您就不会永久陷入循环,瞧!你有你的同步例程。

更新 2:

根据 Shog9 的反馈,我认为这可能是比轮询更好的方法:

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

现在,根据我的初步测试,每个 Tick 事件都有某种漂移。在我的机器上,它在 12 到 20 毫秒之间变化。如果有人对如何可靠地纠正漂移有任何想法,我会对学习感兴趣。

于 2008-11-06T18:23:01.243 回答
0

使用 Timer 对象,将其“间隔”设置为 0,将其“启用”设置为 true。这将大约每 15 毫秒触发一次(基于您的硬件配置)。在该方法中,设置 MyLabel.Text = DateTime.Now.ToString() (或您正在做的任何事情)。

这是完美的表现。

于 2008-11-06T18:59:23.400 回答