время работы программы - PullRequest
       21

время работы программы

0 голосов
/ 05 февраля 2012

Я новичок в программировании. Это мой код:

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 секунды, почему? может из-за каких-то петель?

Ответы [ 3 ]

4 голосов
/ 05 февраля 2012

Это неправильный подход.При запуске программы просто сохраните экземпляр 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 голос
/ 05 февраля 2012

Используя ваш код, я могу сказать, что, вероятно, вы не установили таймер 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, это лучшее решение.

EDIT:

    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 голосов
/ 14 июля 2013

Согласен с startTime - обязательно.Я также прокомментировал DataTime.UtcNow - это правильный путь.

О вашей второй проблеме с задержкой в ​​1,2 секунды - это потому, что тики таймера мчатся рядом с тиками секунды.

1) Если ваш таймер сработает за 998 мс вместо 1000 мс, вы можете прочитать то же количество секунд, и это число останется до следующего такта.

2) Поскольку приложение не имеет приоритета в реальном временис точки зрения ОС, его можно удерживать в течение нескольких секунд (например, для рендеринга мультимедийных материалов другим приложением), и вы можете заметить пропуск в 1 секунду ...

Чтобы решить 1-ю причину и облегчить 2-ю попыткуувеличьте количество тиков, уменьшив интервал до 500 или 333.

Для более продвинутой стратегии, которая сохраняет ваши ресурсы, вы все равно должны использовать 1000 мс, но периодически синхронизировать свой таймер с каждым пересечением полсекунды, используя dateTime.Milliseconds.Это увеличит вероятность избежания проблемы гонок бок о бок без лишних тиков.

...