0

我是编程的初学者。这是我的代码:

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();
    }
}

时间过得太快;/有时会停几秒钟。希望有人可以帮助我:) *编辑// * 感谢您的帮助:) 它有效,但我仍然有一个我之前没有提到的问题。时间有时会停止 1-2 秒,我知道为什么。也许是因为一些循环?

4

3 回答 3

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");
}
于 2012-02-04T20:55:09.547 回答
1

使用您的代码,我可以说您可能还没有设置 timer 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);
    }
于 2012-02-04T21:16:59.373 回答
0

我同意 startTime - 这是强制性的。我还评论了 DataTime.UtcNow - 这是正确的方法。

关于延迟 1..2 秒的第二个问题 - 这是因为计时器的滴答声与秒滴答作并排。

1)如果您的计时器将在 998 毫秒而不是 1000 毫秒内触发,则您可以读取相同的秒数,并且该数字将在下一次滴答之前保持不变。

2)因为从操作系统的角度来看,应用程序不是实时优先级,它可以保持几秒钟(例如,其他应用程序渲染多媒体内容),你可以注意到1秒的跳跃......

为了解决第一个原因并促进第二个尝试通过将间隔减小到 500 或 333 来增加滴答计数。

对于保留资源的更高级策略,您仍应使用 1000 毫秒,但使用 dateTime.Milliseconds 每隔半秒定期同步您的计时器。这将最大限度地避免并排赛车问题而无需额外的滴答声。

于 2013-07-14T10:59:51.487 回答