2012-02-04 71 views
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(); 
    } 
} 

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

+1

*“有时时间停止1-2秒” * - 这听起来像你阻塞UI线程,因此用户界面不会在那个时候更新(“冻结”) - 长时间运行的操作应在不同的完成线程,例如使用BackgroundWorker。这个问题不在你在这里展示的代码中。 – BrokenGlass 2012-02-04 21:57:26

回答

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"); 
} 
+0

对不起,您的答案搞乱:-) – dtb 2012-02-04 21:08:07

+0

@dtb:你的作品的变化,感谢;-) - 我曾以为有几个小时等多个文本框,所以我不担心侧翻 – BrokenGlass 2012-02-04 21:09:42

+0

DateTime.Now是错误的做法太...你应该总是使用DataTime.UtcNow进行内部计算和持久化,除非它被绑定到日期帧(就像在会议调度程序等中那样)。在你的情况下,它可以防止你在程序运行时如果时区被更改而出错。 – 2013-07-14 10:46:11

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

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

关于您与1..2秒滞后第二个问题 - 这是因为计时器的并排蜱赛车侧秒蜱。

1)如果你的计时器将在998ms,而不是1000毫秒被触发,你可以阅读的第二个相同的量,这个数字将留在下前打勾。

2)因为申请不但从OS点实时优先级,可以保持几秒钟(例如,用于其他应用程序呈现多媒体的东西),你可以看到1秒的跳跃...

为了解决第一个原因和推动第二个尝试,以增加由蜱间隔减少到500或333

对于保持你的资源,你还是应该使用1000毫秒,但同步你每半周期定时器更先进的战略计第二次穿越使用dateTime.Milliseconds。这将最大限度地避免并排赛车问题,而无需额外滴答。