web-dev-qa-db-fra.com

Intervalle de minuterie 1000! = 1 seconde?

J'ai une étiquette qui devrait montrer les secondes de mon timer (ou dans un autre mot, une variable à laquelle est ajouté 1 à chaque intervalle du timer). L'intervalle de mon minuteur est défini sur 1000, l'étiquette doit donc se mettre à jour toutes les secondes (et afficher également les secondes). Mais l'étiquette est déjà après des secondes dans les centaines. Quel est l'intervalle approprié pour obtenir 1 seconde?

int _counter = 0;
Timer timer;

timer = new Timer();
timer.Interval = 1000;
timer.Tick += new EventHandler(TimerEventProcessor);
label1.Text = _counter.ToString();
timer.Start();

private void TimerEventProcessor(object sender, EventArgs e)
{
  label1.Text = _counter.ToString();
  _counter += 1;
}
10
Tim Kathete Stadler

L'intervalle approprié pour obtenir une seconde est 1000. La propriété Interval est le temps entre les ticks, en millisecondes:

MSDN: propriété Timer.Interval

Donc, ce n'est pas l'intervalle que vous définissez qui est faux. Vérifiez le reste de votre code pour quelque chose comme changer l'intervalle du minuteur ou lier l'événement Tick plusieurs fois.

10
Guffa

Au lieu de l'événement Tick, utilisez l'événement Elapsed.

timer.Elapsed += new EventHandler(TimerEventProcessor);

et changer la signature de la méthode TimerEventProcessor;

private void TimerEventProcessor(object sender, ElapsedEventArgs e)
{
  label1.Text = _counter.ToString();
  _counter += 1;
}
5
daryal

Y a-t-il d'autres endroits où vous utilisez TimerEventProcessor ou Counter? 

Quoi qu’il en soit, vous ne pouvez pas compter sur le fait que l’événement soit livré exactement un par seconde. Le temps peut varier et le système ne s'assurera pas que le temps moyen est correct. 

Donc, au lieu de _Counter, vous devriez utiliser:

 // when starting the timer:
 DateTime _started = DateTime.UtcNow;

 // in TimerEventProcessor:
 seconds = (DateTime.UtcNow-started).TotalSeconds;
 Label.Text = seconds.ToString();

Remarque: cela ne résout pas le problème d'appels fréquents de TimerEventProcessor, ni d'incrémentation de _Counter. cela ne fait que le masquer, mais c'est aussi la bonne façon de le faire. 

1
peterchen