我有一个计时器。但是它开始了一秒钟。我的意思是,我正按计时器计时。但是通过计时器更新的时钟中的时间比实际经过的时间少一秒。计时器一秒钟开始。如何设置我的计时器在正确的时间开始显示实际时间?这是tick事件中的代码:
if (currentState == play)
{
m_StatusLabel.Text = String.Format("Playing {0} ", format(timeCounter));
timeCounter++;
}
这里timeCounter每秒更新一次。
答案 0 :(得分:3)
标准System.Windows.Forms
计时器不保证'节拍器质量'。为此,您需要Systems.Threading.Timer
或System.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)
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