1

我对这个很沮丧..

我在文本框中有一个称为计时器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;
}

它实际上是以我想要的方式在文本框中显示它,但它没有正确计数..我的意思是,它的计数不到一秒..

你能告诉我如何解决这个..

4

2 回答 2

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();
}
于 2012-07-21T00:02:31.943 回答
0

不使用计时器,而是使用 DateTime.Now 记录开始时间,然后从开始时间中减去当前时间 (DateTime.Now)。这将为您提供更准确的计时器,因为它使用不受 CPU 性能影响的系统时钟。

或者,您可以使用 System.Diagnostics.Stopwatch 为您执行此操作。

您仍然可以使用间隔小于一秒的普通计时器来刷新显示时间的标签。

于 2012-07-21T00:04:23.650 回答