让程序正常运行

时间:2012-02-04 20:52:40

标签: c# visual-studio-2010 uptime

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

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为什么。也许是因为一些循环?

3 个答案:

答案 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定期与每半秒交叉同步定时器。这将最大限度地避免并排赛车问题的可能性,而无需额外的嘀嗒声。