【发布时间】:2012-07-20 23:55:00
【问题描述】:
我对此感到非常沮丧..
我有一个名为 timer1 的计时器和一个名为 TimeElapsedTextBox 的文本框和一个名为 double 的变量 TimeTakenToFinish
计时器每 1 秒(1000 毫秒)计时一次
在文本框中,我希望它以这种格式显示时间:
Seconds.PartsOfSecond
这里是 Tick 事件:
private void timer1_Tick(object sender, EventArgs e)
{
TimeTakenToFinish += (double)timer1.Interval / 10000;
TimeElapsedTextBox.Text = TimeTakenToFinish;
}
它实际上是以我想要的方式在文本框中显示它, 但它没有正确计算.. 我的意思是,它的计数不到一秒..
你能告诉我如何解决这个问题吗..
【问题讨论】:
-
不要只在每个刻度上添加请求的间隔。相反,您应该查看实际经过了多少时间,并将该数字添加到
TimeTakenToFinish。 -
如果您唯一的问题是需要更高的精度,请考虑
System.Diagnostics.Stopwatch类。它有一个静态属性IsHighResolution,其true值表明您的处理器支持高分辨率计时器。有关详细信息,请参阅msdn.microsoft.com/en-us/library/…。 -
您需要在秒表上使用 .Elapsed(以及任何 .ElapsedXXX 属性)。您当前使用的方法每个滴答声都会产生一些舍入误差,因为计时器不保证会以您准确的速率触发告诉它。这将导致“你的时间”每滴答一下就偏离现实。使用“delta”方法(记录
starttime,然后每个刻度显示starttime - currenttime)保持准确。甚至更好:使用 Stopwatch 类,它旨在做你想做的事。 -
@Kivin 我不认为 Vexe 需要高分辨率。对于大多数在表格上测量和显示的东西来说,“常规”秒表就可以了。我不认为他在这里计算 CPU 周期;)他的问题是他使用的方法(假设计时器每 1000 毫秒触发一次 exactly* 而它没有)。使用这种方法,即使是高分辨率计时器最终也会消失。 Windows(和大多数操作系统)不是 RT-OS(甚至那些最终也会漂移)
-
@EdS。一切都很好,但您并不需要如此高的准确度。因此,即使
IsHighResolution出于某种原因返回 false,它仍然足以准确地测量 Vexe 尝试执行的“CPS/WPM”。假设 Vexe 现在有了这些答案,至少能够测量一分钟而不会使每个“滴答”漂移几毫秒,您所需要做的就是计算一分钟的击键次数,这将导致 CPS/WPM 分数 +/- .01 .谁在乎测量是否“意外” 00:01:00.015 ?这不影响分数。如果您测量的是 F1 圈速,那么您需要更高的准确度。