如何制作精确的十进制计时器?

时间:2012-07-20 23:55:00

标签: c# winforms timer

我对这个感到非常沮丧..

我有一个名为timer1的计时器和一个名为TimeElapsedTextBox的文本框以及一个名为double的{​​{1}}变量 计时器每1秒钟(1000毫秒) 在文本框中,我希望它以这种格式显示时间:

TimeTakenToFinish

这是Tick事件:

Seconds.PartsOfSecond

它实际上是按照我想要的方式在文本框中显示它, 但这不算数...... 我的意思是,它的数量还不到真正的第二个......

你可以告诉我如何解决这个问题。

2 个答案:

答案 0 :(得分:8)

这里的问题是对操作系统工作方式的误解。当然,您可以将间隔设置为1000ms,但您不能指望它实际上每秒都会打勾。您在Windows上运行代码,而不是硬(或软)实时操作系统。

顺便说一句,您还应该知道计时器的分辨率是有限的,截至今天,仅限于系统计时器的准确度,可能大约为15毫秒。

您不能指望您的代码在这种环境中确定性地执行。在任何时候,操作系统都可以先发制人地将您从CPU中解救出来并开始处理其他任务。

虽然我会问,你根本无法获得所需的准确度;它真的需要吗?可能不是,但你还没有告诉我们你在这里想要实现的目标,那么谁知道呢?

另外,这是错误的:

TimeTakenToFinish += (double)timer1.Interval / 10000;

Interval是一个属性,用于大致告诉计时器它应该触发Tick事件的频率。你实际上并没有测量任何东西,你也可以每次都向你的计数器添加1000.0 / 10000

如果需要更高精度,请使用StopWatch类,该类使用CPU的高性能计时器(如果可用)。您仍然可以使用计时器根据秒表的当前经过值定期更新UI,即

void timer1_Tick(...)
{
    var totalSeconds = _someStopwatch.ElapsedMilliseconds / 1000.0;
    TimeElapsedTextBox.Text = totalSeconds.ToString();
}

答案 1 :(得分:0)

使用DateTime.Now记录开始时间,然后从开始时间减去当前时间(DateTime.Now),而不是使用计时器。这将为您提供更准确的计时器,因为它使用系统时钟而不受CPU性能的影响。

或者您可以使用System.Diagnostics.Stopwatch为您执行此操作。

您仍然可以使用间隔小于一秒的普通计时器来刷新显示时间的标签。