我对这个很沮丧..
我有一个名为 timer1
的计时器和一个名为 TimeElapsedTextBox
的文本框以及一个名为 TimeTakenToFinish
的 double
变量
计时器每 1 秒计时一次(1000 毫秒)
在文本框中,我希望它以这种格式显示时间:
Seconds.PartsOfSecond
这里是 Tick 事件:
private void timer1_Tick(object sender, EventArgs e)
{
TimeTakenToFinish += (double)timer1.Interval / 10000;
TimeElapsedTextBox.Text = TimeTakenToFinish;
}
它实际上以我想要的方式在文本框中显示它, 但它没有正确计算.. 我的意思是,它的计数还不到真正的一秒..
你能告诉我如何解决这个问题吗..
最佳答案
这里的问题是对操作系统工作方式的误解。当然,您可以将间隔设置为 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();
}
关于c# - 如何制作一个准确的十进制定时器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11588337/