2015-10-07 2 views
1

У меня есть этот код:Сделать таймер декремент фактические секунд

public void startSpinTimer() 
{ 
    spinTimer = new DispatcherTimer(); 
    spinTimer.Tick += spinTimer_Tick; 
    spinTimer.Interval = new TimeSpan(0, 0, 0, 1); 
    spinTimer.Start(); 
} 

void spinTimer_Tick(object sender, object e) 
{ 
    spinTime--; 
    spinnerTimer_txtBlock.Text = spinTime.ToString(); 
} 

Переменная spinTime является 6 в данном случае. Я пытаюсь сделать 6 представлений часов, поэтому он будет отображаться как 06:00:00, а затем каждый раз, когда отметит таймер, потребуется секунда, чтобы сменить 06:00:00 на 05:59:59 затем 05:59:58 и т. д.

Я попытался преобразовать spinTime в переменную DateTime, однако она не работает, похоже, что я не пойду по правильному пути, чтобы достичь того, что я Я пытаюсь это сделать.

Кто-нибудь знает, что я делаю неправильно?

Thanks

+0

Что такое 'spinTime'? Вы должны уметь вычесть из 'TimeSpan', что-то вроде' spinnerTimer_txtBlock.Text = Timespan.FromHours (6) .Subtract (TimeSpan.FromSeconds (spinTime)). ToString() 'и увеличивать' spinTime' вместо уменьшения (начиная с нуля). –

+0

spinTime - это 'int', в котором хранятся 6 @RonBeyer – KTOV

+0

См. Мое редактирование, увеличьте его и используйте временной интервал, чтобы определить новое время на каждом тике. –

ответ

3

Я предполагаю, что spinTime - это тип TimeSpan. Вы можете использовать это для уменьшения секунды.

  spinTime = spinTime.Subtract(TimeSpan.FromSeconds(1)); 
+1

Проблемы в том, что таймерные тики не точны, поэтому, если вы просто вычтите одну секунду каждый раз, когда вы можете отключиться на несколько минут или больше, когда это будет сделано. Лучше сохранить исходную точку и вычислить разницу во времени каждый раз. –

+0

Как вы сделали свой 'int' (spinTime) метод' Subtract'? O.o – KTOV

+0

@KTOV, он предполагал, что ваш 'spinTime' является' TimeSpan'. Но вы должны изучить методы расширения. –

2

Вместо того чтобы использовать целое число, Я хотел бы использовать DateTime, которая хранит текущее время + 6 часов, и вычислить разность между текущим временем и «конец» время:

// right before starting timer 
DateTime endTime = DateTime.Now.AddHours(6); 

// in the `Tick` event: 
spinnerTimer_txtBlock.Text = (endTime - DateTime.Now).ToString("hh\\:mm\\:ss"); 
1

Использование таймер для «отметки секунд» ненадежен. Вы не можете гарантировать, что тик будет происходить ровно через 1 секунду. Вместо этого я предлагаю следующее:

DateTime start = DateTime.Now; //On the start of the timer store the current time 
TimeSpan spinTime = new TimeSpan (6,0,0); //Time to spin 

На каждом тике оценить разницу между текущим временем и временем начала:

TimeSpan delta = DateTime.Now-start; //Time elapsed since start 
TimeSpan timeRemaining = spinTime - delta; //Time remaining 

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

Смежные вопросы