我很沮丧,这一个..
我有一个名为定时器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;
}
它实际上是在文本显示它框我想要的方式,但它不能正确计算。我的意思是,它的票不到一个真正的第二..
你能告诉我怎么解决这个问题..
在这里你的问题是你的操作系统工作方式的误解。 当然,你可以将间隔设置为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();
}
而不是使用一个计时器,使用DateTime.Now记录起始时间,然后减去从开始时的当前时间(DateTime.Now)。 这会给你一个更精确的计时器,因为它使用的系统时钟,而不是它不会受到CPU性能这么多。
或者您可以使用System.Diagnostics.Stopwatch它可以实现这个要求。
你仍然可以使用普通的计时器小于第二间隔刷新显示时间的标签。