定时器开始较晚,因此显示的时间是实际时间的第二个时间

时间:2010-12-18 14:22:01

标签: c# winforms

我有一个计时器。但是它开始了一秒钟。我的意思是,我正按计时器计时。但是通过计时器更新的时钟中的时间比实际经过的时间少一秒。计时器一秒钟开始。如何设置我的计时器在正确的时间开始显示实际时间?这是tick事件中的代码:

 if (currentState == play)
 {
     m_StatusLabel.Text = String.Format("Playing {0} ", format(timeCounter));
     timeCounter++;
 }

这里timeCounter每秒更新一次。

4 个答案:

答案 0 :(得分:3)

标准System.Windows.Forms计时器不保证'节拍器质量'。为此,您需要Systems.Threading.TimerSystem.Timer

参考:Comparing the Timer Classes in the .NET Framework Class Library

答案 1 :(得分:0)

没有可用的计时器可以保证实时准确性,甚至System.Threading.Timer也无法做到。例如,当您要求Threading.Timer在30ms内触发时,实际上可能需要40ms或200ms。或者,如果你要求1秒,它可能会在1.01秒内开火。在你的时间不准确之前不会很久。

这样做的原因是定时器使回调线程可调度,但线程调度程序实际调用线程仍需要时间。系统正在执行的各种操作可以延迟该回调。

答案 2 :(得分:0)

Windows计时器只提供一个保证:在超时间隔过去之前不会触发。具体来说,当消息队列中有消息时,线程永远不会收到计时器事件。

因此,您无法使用计时器来实现时钟。如果您想更新状态消息以显示某些内容已播放多长时间,那么您可以尝试:记录开始时间,当您的计时器滴答获得当前时间时,减去开始时间并显示差异。您的状态消息不会每秒更新一次,但更新时它将是正确的。

答案 3 :(得分:0)

显示数字1更大:

if (currentState == play)
     m_StatusLabel.Text = String.Format("Playing {0} ",
                                        format(++timeCounter) );

请注意

请考虑建议将经过时间显示为当前时间 - 开始时间的原因。这就是通常这样做的方式。它更准确;计时器在繁忙的系统上可能是不规则的。仍然可以每秒更新显示的值。这里的伪代码为now()。这需要获取当前时间并执行时差。

if (currentState == play)
     m_StatusLabel.Text = String.Format("Playing {0} ",
                                  format( (now() - start)/1000 );

参见:
1. DateTime.Subtraction
2. DateTime.Now