如何作出准确的十进制计时器?(How to make an accurate decimal Tim

2019-06-26 10:38发布

我很沮丧,这一个..

我有一个名为定时器timer1 ,并呼吁一个文本框TimeElapsedTextBoxdouble变量名为TimeTakenToFinish计时器滴答每隔1秒(1000毫秒)在文本框中,我希望它显示在此格式的时间:

Seconds.PartsOfSecond

这里是Tick事件:

private void timer1_Tick(object sender, EventArgs e)
{
  TimeTakenToFinish += (double)timer1.Interval / 10000;
  TimeElapsedTextBox.Text = TimeTakenToFinish;
}

它实际上是在文本显示它框我想要的方式,但它不能正确计算。我的意思是,它的票不到一个真正的第二..

你能告诉我怎么解决这个问题..

Answer 1:

在这里你的问题是你的操作系统工作方式的误解。 当然,你可以将间隔设置为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();
}


Answer 2:

而不是使用一个计时器,使用DateTime.Now记录起始时间,然后减去从开始时的当前时间(DateTime.Now)。 这会给你一个更精确的计时器,因为它使用的系统时钟,而不是它不会受到CPU性能这么多。

或者您可以使用System.Diagnostics.Stopwatch它可以实现这个要求。

你仍然可以使用普通的计时器小于第二间隔刷新显示时间的标签。



文章来源: How to make an accurate decimal Timer?