【问题标题】:Writing a more efficient clock function编写更高效的时钟函数
【发布时间】:2010-09-21 03:30:37
【问题描述】:

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

只有在秒数变化的情况下才能更直接地访问时间吗?

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

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

【问题讨论】:

    标签: .net vb.net performance clock


    【解决方案1】:

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

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

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

    更新:

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

    更新 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 毫秒之间变化。如果有人知道如何可靠地纠正漂移,我将有兴趣学习。

    【讨论】:

    • 你建议坐在一个循环中并轮询系统时钟?
    • 只是暂时的。确定拐点后,调用具有事件的系统计时器。
    • 嗯...为什么不直接将下一个计时器间隔调整为距离上一秒的毫秒数?
    • 朋友,这是个好主意!
    • 谢谢。 FWIW,漂移是由于 Windows 计时器的默认粒度 - 15ms。如果消息处理时间超过几毫秒,也可能会出现延迟,因为计时器消息的优先级很低。顺便说一句 - 我用 VB 替换了你的代码,因为这是一个 VB 问题;希望你不介意。
    【解决方案2】:

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

    这是完美的表现。

    【讨论】:

    • 性能...因为您没有注意到您的机器上的开销?或者在运行半平凡的代码中表现出比必要的多很多倍的性能,这对于任何硬件上的任何应用程序来说都不是什么大问题?
    猜你喜欢
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 2011-01-03
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    相关资源
    最近更新 更多