【问题标题】:getting program uptime获得程序正常运行时间
【发布时间】:2012-02-04 20:52:39
【问题描述】:

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

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 秒,我知道为什么。可能是因为一些循环?

【问题讨论】:

  • “时间有时会停止 1-2 秒” - 听起来您正在阻塞 UI 线程,因此 UI 不会在那段时间内更新(“冻结”) - 长时间运行的操作应该在不同的线程上完成,例如使用 BackgroundWorker。问题不在您在此处显示的代码中。

标签: c# visual-studio-2010 uptime


【解决方案1】:

这是错误的方法。当你程序开始时,只需保存一个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");
}

【讨论】:

  • 抱歉弄乱了你的答案:-)
  • @dtb:您的更改有效,谢谢 ;-) - 我假设有几个小时的文本框等等,所以我不担心翻转
  • DateTime.Now 也是错误的方法......您应该始终使用 DataTime.UtcNow 进行内部计算和持久性,除非它绑定到日框架(如会议安排程序等)。在您的情况下,如果在程序运行时更改时区,它可以防止您出错。
【解决方案2】:

使用你的代码,我可以说你可能没有设置计时器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);
    }

【讨论】:

    【解决方案3】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 2014-06-29
      • 1970-01-01
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      • 2010-12-19
      相关资源
      最近更新 更多