我对这个感到非常沮丧..
我有一个名为timer1
的计时器和一个名为TimeElapsedTextBox
的文本框以及一个名为double
的{{1}}变量
计时器每1秒钟(1000毫秒)
在文本框中,我希望它以这种格式显示时间:
TimeTakenToFinish
这是Tick事件:
Seconds.PartsOfSecond
它实际上是按照我想要的方式在文本框中显示它, 但这不算数...... 我的意思是,它的数量还不到真正的第二个......
你可以告诉我如何解决这个问题。答案 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为您执行此操作。
您仍然可以使用间隔小于一秒的普通计时器来刷新显示时间的标签。