c# - 如何制作一个准确的十进制定时器?

标签 c# winforms timer

我对这个很沮丧..

我有一个名为 timer1 的计时器和一个名为 TimeElapsedTextBox 的文本框以及一个名为 TimeTakenToFinishdouble 变量 计时器每 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/

相关文章:

javascript - 如何使用 Javascript 在 Html 页面上添加计时器

Android - 任何允许使用暂停、恢复的计时器组件

javascript - 将 jQuery (Json) 中的日期时间附加到表中

c# - 使用 System.Globalization.CultureInfo.InvariantCulture 将字符串转换为日期时间

按钮上的 C# 图标(调整大小)

c# - 如何在 C# 中关闭 MessageBox 后强制按钮、文本框在窗体上重新绘制

java - 在Java中启动定时器

c# - 多线程应用中静态全局非托管资源的管理

C# winforms 弹出背景褪色

c# DataGridViewComboBoxColumn selectedValue 分布在整行