我是编程的初学者。这是我的代码:
private void timer1_Tick(object sender, EventArgs e)
{
sec++;
textBoxSeconds.Text = sec.ToString();
if (sec > 59)
{
sec = 0;
textBoxSeconds.Text = sec.ToString();
min++;
textBoxMinutes.Text = min.ToString();
}
}
时间过快; /并且有时会停止几秒钟。 希望有人可以帮助我:)。 * EDIT // * 谢谢你的帮助:)它有效,但我仍然有一个问题,我没有早些时候。时间有时会停止1-2秒,idk为什么。也许是因为一些循环?
答案 0 :(得分:4)
这是错误的做法。当您开始编程时,只需保存DateTime
个实例,即startTime
。在您的计时器中,计时器计算当前时间和开始时间之间的差异并显示该值。
private DateTime startTime = DateTime.Now;
private void timer1_Tick(object sender, EventArgs e)
{
var delta = DateTime.Now - startTime;
textBoxSeconds.Text = delta.Seconds.ToString("n0");
textBoxMinutes.Text = Math.Floor(delta.TotalMinutes).ToString("n0");
}
答案 1 :(得分:1)
使用你的代码,我可以说你可能没有设置计时器Interval
,所以:
timer1.Interval = 1000; //1000 ms = 1 second
然后,您可以改进Tick
事件中的内容:
private void timer1_Tick(object sender, EventArgs e)
{
sec++;
if (sec == 60)
{
sec = 0;
min++;
}
textBoxSeconds.Text = sec.ToString();
textBoxMinutes.Text = min.ToString();
}
所以使用DateTime
类,这是最好的解决方案。
修改强>
DateTime startTime = DateTime.Now;
void timer1_Tick(object sender, EventArgs e)
{
TimeSpan time = DateTime.Now - startTime;
textBoxSeconds.Text = string.Format("{0:0#}", time.Seconds);
textBoxMinutes.Text = string.Format("{0:0#}", time.Minutes);
}
答案 2 :(得分:0)
我同意startTime - 这是强制性的。我也评论过DataTime.UtcNow - 这是正确的方法。
关于你的第二个问题,延误时间为1..2秒 - 这是因为计时器的嘀嗒声与秒数并排竞争。
1)如果您的计时器将在998ms而不是1000ms内被触发,您可以读取相同的秒数,这个数字将在下一个滴答之前停留。
2)因为从操作系统的角度来看应用程序不是实时优先级,所以它可以保持几秒钟(例如,用于通过其他应用程序渲染多媒体内容),你可以注意到跳过1秒... < / p>
解决第一个原因,并通过将Interval减少到500或333来促进第二次尝试增加刻度计数。
对于保留资源的更高级策略,您仍应使用1000毫秒,但使用dateTime.Milliseconds定期与每半秒交叉同步定时器。这将最大限度地避免并排赛车问题的可能性,而无需额外的嘀嗒声。