web-dev-qa-db-fra.com

Comment réinitialiser une minuterie en C #?

A ma connaissance, il existe trois classes Timer: System.Threading.Timer, System.Timers.Timer Et System.Windows.Forms.Timer, Mais aucune de ces classes n'a un .Reset() fonction qui remettrait le temps écoulé actuel à 0.

Existe-t-il une classe BCL dotée de cette fonctionnalité? Y a-t-il un moyen de le faire sans hack? (Je pensais que peut-être changer la limite de temps pourrait la réinitialiser) Pensée à quel point il serait difficile de réimplémenter une classe Timer qui avait cette fonctionnalité, ou comment le faire de manière fiable avec l’une des classes BCL?

106
Matthew Scharley

Je fais toujours ...

myTimer.Stop();
myTimer.Start();

... Est-ce un hack? :)

Par commentaire, sur Threading.Timer, c'est le Changer de méthode ...

dueTime Type: System.Int32 Délai, en millisecondes, avant l'appel de la méthode de rappel spécifiée lors de la construction du minuteur. Spécifiez Timeout.Infinite pour empêcher la minuterie de redémarrer. Spécifiez zéro (0) pour redémarrer le chronomètre immédiatement.

139
JP Alioto

Tous les minuteurs ont l'équivalent des méthodes Start () et Stop (), à l'exception de System.Threading.Timer.

Donc, une méthode d'extension telle que ...

public static void Reset(this Timer timer)
{
  timer.Stop();
  timer.Start();
}

... est une façon de s'y prendre.

55
Dan

Pour System.Timers.Timer, selon la documentation MSDN, http://msdn.Microsoft.com/en-us/library/system.timers.timer.enabled.aspx :

Si l'intervalle est défini après le démarrage de la minuterie, le compte est réinitialisé. Par exemple, si vous définissez l'intervalle sur 5 secondes, puis que vous définissez la propriété Enabled sur true, le décompte commence au moment où le paramètre Enabled est défini. Si vous réinitialisez l'intervalle à 10 secondes lorsque le nombre est égal à 3 secondes, l'événement Elapsed est déclenché pour la première fois 13 secondes après que le paramètre Enabled a été défini sur true.

Alors,

    const double TIMEOUT = 5000; // milliseconds

    aTimer = new System.Timers.Timer(TIMEOUT);
    aTimer.Start();     // timer start running

    :
    :

    aTimer.Interval = TIMEOUT;  // restart the timer
23
mMontu

Vous pouvez écrire une méthode d’extension appelée Reset (), qui

  • appelle Stop () - Start () pour Timers.Timer et Forms.Timer
  • appelle Change for Threading.Timer
6
Gishu

Je viens d'attribuer une nouvelle valeur à la minuterie:

mytimer.Change(10000, 0); // reset to 10 seconds

ça fonctionne bien pour moi.

en haut du code définissez le timer: System.Threading.Timer myTimer;

if (!active)
        {
            myTimer= new System.Threading.Timer(new TimerCallback(TimerProc));
        }
        myTimer.Change(10000, 0);
        active = true;

private void TimerProc(object state)
    {
        // The state object is the Timer object.
        System.Threading.Timer t = (System.Threading.Timer)state;
        t.Dispose();
        Console.WriteLine("The timer callback executes.");
        active = false;
        //action to do when timer is back to zero
    }
4
Quispie

Pour plus de clarté, car d’autres commentaires sont incorrects. Lorsque vous utilisez System.Timers, Le paramètre Activé sur true réinitialisera le temps écoulé. Je viens de tester le comportement avec ce qui suit:

Timer countDown= new Timer(3000);

Main()
{
    TextBox.TextDidChange += TextBox_TextDidChange;
    countdown.Elapsed += CountDown_Elapsed;
}

void TextBox_TextDidChange(Object sender, EventArgs e)
{
    countdown.Enabled = true;
}

void CountDown_Elapsed(object sender, EventArgs e)
{
    System.Console.WriteLine("Elapsed");
}

Je saisis le texte dans la zone de texte à plusieurs reprises et le chronomètre ne fonctionnait que 3 secondes après la dernière frappe. Vous le verrez également dans la documentation, comme vous le verrez: appeler Timers.Start() définit simplement Enabled sur true.

Et pour être sûr, ce que j'aurais dû faire tout droit du début, vous verrez dans le source de référence .NET que si l'activation d'un minuteur déjà activé, il appelle le privé UpdateTimer(), qui appelle en interne Change().

3
NickSpag

Pour une minuterie (System.Windows.Forms.Timer).

Les méthodes .Stop, puis .Start ont fonctionné comme une réinitialisation.

2
elmsoftware

Une autre méthode alternative pour réinitialiser windows.timer consiste à utiliser le compteur, comme suit:

int tmrCtr = 0;
Timer mTimer;

private void ResetTimer()
{
  tmrCtr = 0;
}

private void mTimer_Tick()
{
  tmrCtr++;
  //perform task
}  

Ainsi, si vous avez l’intention de répéter toutes les secondes, vous pouvez régler l’intervalle de minuterie à 100 ms et tester le compteur à 10 cycles.

Cela convient si le minuteur doit attendre que certains processus s’arrêtent à une heure différente.

1
ivan

Tu peux faire timer.Interval = timer.Interval

1
Ella Shar

je fais ça

//Restart the timer
queueTimer.Enabled = true;
1
Rissa