Рейтинг:
11
OriginalGriff
Таймер не "срабатывает" с точными интервалами, они обрабатываются через обычную систему сообщений Windows, которая никоим образом не является системой реального времени, формой или формой. Все, что вам гарантировано, - это то, что событие тика таймера не произойдет меньше, чем за этот интервал.
Таким образом, способ сделать обратный отсчет состоит в том, чтобы установить уровень класса DateTime на конечное время:
private DateTime endsAt;
...
endsAt = DateTime.Now.AddMinutes(5);
Затем в обработчике тиков подсчитайте сколько осталось:
void countDown_Tick(object sender, EventArgs e)
{
int secondsRemaining = (int) (endsAt - DateTime.Now).TotalSeconds;
myLabel.Text = secondsRemaining.ToString();
}
db211086004
Но тогда почему это работает для второго метода? Тот, который использует вычисление даты и времени.
Кроме того, когда я использую ваш метод, я не могу установить правильное количество времени (часы, минуты, секунды, миллисекунды) и отформатировать его в строку. Он показывает все время в заданном количестве (секунды или миллисекунды).
OriginalGriff
:вздыхать:
Мой код был примером того, что вы можете сделать: если вы посмотрите на класс TimeSpan (который возвращает вычитание двух значений DateTime), он даст вам все необходимые биты.
Это работает, потому что не имеет значения, когда на самом деле происходит тик - метка обновляется с текущим оставшимся временем, даже если это не произошло в течение десяти минут!
db211086004
Я надеюсь, что не буду еще больше раздражать вас, задавая еще один последующий вопрос, но я прочитал статьи класса TimeSpan в Microsoft Docs и MSDN и попытался использовать и изменить предложенный вами код, но не могу заставить его работать. Моя метка не показывает обратного отсчета, она просто показывает количество времени, прошедшее с момента нажатия кнопки (даже после форматирования строки), а не исходное установленное время минус прошедшее время.
Я пытался создать 2 значения TimeSpan и вычесть их (я даже сложил их вместе, чтобы посмотреть, имеет ли это значение), я пытался сделать то же самое с 2 значениями DateTime, я пытался добавить время с помощью TimeSpan.Часы (и делать то же самое для минут, секунд и миллисекунд все в одной строке кода), я даже нашел пользовательский класс CountDownTimer и использовал и изменил его, но все они не работают.
Я либо получаю метку, которая просто показывает общее количество прошедшего времени, считая вверх (в зависимости от того, как я кодирую ее иногда с символом - перед ней) с помощью метода DateTime, либо метка не обновляется с правильным интервалом (при использовании обычного таймера).
OriginalGriff
Поэтому покажите нам точный код, который вы использовали в своем тиковом событии.
db211086004
Это код для обычного таймера, который я нашел в учебнике:
milliseconds--;
if(milliseconds == 0)
{
if(seconds > 0 || minutes > 0 || hours > 0)
{
seconds--;
milliseconds = 999;
if(seconds < 0)
{
if(minutes > 0)
{
minutes--;
seconds = 59;
}
}
if(minutes < 0)
{
if(hours > 0)
{
hours--;
minutes = 59;
}
}
}
}
if(hours == 0 && minutes == 0 && seconds == 0 && milliseconds == 0)
{
timer1.Stop();
MessageBox.Show("You have arrived.");
}
label_Timer.Text = string.Format("{0}:{1}:{2}:{3}", hours.ToString().PadLeft(2, '0'), minutes.ToString().PadLeft(2, '0'), seconds.ToString().PadLeft(2, '0'), milliseconds.ToString().PadLeft(2, '0'));
Это код для вычисления даты и времени:
TimeSpan timeElapsed = DateTime.Now - startTime;
// DOES THE SAME AS ABOVE BUT WITH A - IN FRONT OF IT
//TimeSpan timeElapsed = startTime - DateTime.Now;
label_DateTime.Text = timeElapsed.TotalSeconds.ToString("00:00:00.000");
Я экспериментировал с меткой DateTime, но никогда не получал реального обратного отсчета.
OriginalGriff
:вздыхать:
Вернитесь к моему первоначальному ответу и прочитайте то, что я сказал.
Если вычесть текущее время из времени начала, то, конечно, вы получите увеличивающееся (если отрицательное) значение!
Затем вернитесь и посмотрите, что я сказал в ответ на ваш первый комментарий. TotalSeconds-это всего лишь одно из значений, которые может предоставить TimeSpan ...
db211086004
Я просто хочу поблагодарить вас за ваше время и использовать обычный таймер обратного отсчета с интервалом в 1 секунду.
Вы явно не заинтересованы в том, чтобы помогать, иначе вы не вздыхали бы каждый раз, когда задаете вопрос, что является нормальным делом на справочном форуме. Если бы я знал, что делаю, я бы не задавал вопросов.
Я уже перепробовал все, что вы предлагали, включая TotalHours, TotalMinutes и т. д., Но я просто не могу получить ярлык, который отсчитывает время.
Так что спасибо, что уделили мне время.
OriginalGriff
Причина, по которой я вздыхаю, заключается в том, что вы не слушаете и не думаете о том, что вы делаете - вы подбираете слова и угадываете - и это не лучший способ развить что-либо или даже узнать, что вы делаете!
Это не сложная задача: и если вы сойдете с коня и займетесь своим мозгом в течение пяти минут вместо того, чтобы ожидать, что другие просто дадут вам весь код, вы его решите.
Но удачи вам!