.net 编写更高效的时钟函数

.net 编写更高效的时钟函数,.net,vb.net,performance,clock,.net,Vb.net,Performance,Clock,我在VB.NET程序中有一个时钟功能,可以显示包括秒在内的时间。我目前有一个计时器,使用NOW不断轮询。我必须经常轮询系统时钟,因为我需要第二次更新与系统时钟同步 只有当秒数改变时,是否有更直接的方法来访问时间 有没有更有效的方法来编写此代码 如果您需要更多信息,请告诉我。为什么不使用计时器组件?这假设您使用的是GUI,而不是构建服务 您可以调用执行轮询的同步例程,使计时器非常接近变化的秒数,然后委托给计时器。您可以每隔一分钟左右调用一次同步例程,以确保没有任何操作系统漂移 也就是说,我确信有一

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

只有当秒数改变时,是否有更直接的方法来访问时间

有没有更有效的方法来编写此代码


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

为什么不使用计时器组件?这假设您使用的是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

现在,根据我的初步测试,每个滴答声事件都会有某种程度的漂移。在我的机器上,它在12到20毫秒之间变化。如果有人知道如何可靠地纠正漂移,我会有兴趣学习。

使用计时器对象,将其“间隔”设置为0,将其“启用”设置为true。大约每15毫秒触发一次(根据您的硬件配置)。在该方法中,设置MyLabel.Text=DateTime.Now.ToString()


这是完美的性能。

您建议坐在一个循环中,轮询系统时钟?只是暂时的。确定拐点后,调用具有事件的系统计时器。嗯。。。为什么不把下一个计时器的时间间隔调整到距离最后一秒的毫秒数呢?我的朋友,这真是个好主意!谢谢FWIW,漂移是由于Windows计时器的默认粒度-15ms造成的。如果消息处理时间超过几毫秒,也可能会出现延迟,因为计时器消息的优先级非常低。顺便说一句,我用VB替换了你的代码,因为这是一个VB问题;希望你不介意。表演。。。因为你没有注意到你机器上的开销?或者说,对于任何硬件上的任何应用程序来说,运行比需要多得多、多得多的半琐碎代码并不是一件大事?