6 votes

Obtenir la valeur d'un compteur System.Windows.Forms.Timer ?

J'ai un petit problème avec la minuterie du formulaire Windows. C'est une question très basique, mais j'ai cherché partout et je ne semble pas trouver la réponse (je mérite probablement une gifle).

J'ai besoin de pouvoir obtenir la valeur du timer, si son temps écoulé est supérieur à un intervalle de 500ms.

quelque chose comme

Timer.Elapsed >= 500

0voto

Andrew Points 1

D'après ma discussion avec David aquí à propos de Stopwatch vs DateTime J'ai décidé de publier les deux approches (très simplifiées) pour les cas où vous devez obtenir le temps restant, afin que vous puissiez décider laquelle est la meilleure pour vous :

public partial class FormWithStopwatch : Form
{
    private readonly Stopwatch sw = new Stopwatch();
    // Auxiliary member to avoid doing TimeSpan.FromMilliseconds repeatedly
    private TimeSpan timerSpan;

    public void TimerStart()
    {
        timerSpan = TimeSpan.FromMilliseconds(timer.Interval);
        timer.Start();
        sw.Restart();
    }

    public TimeSpan GetRemaining()
    {
        return timerSpan - sw.Elapsed;
    }

    private void timer_Tick(object sender, EventArgs e)
    {
        // Do your thing
        sw.Restart();
    }
}

public partial class FormWithDateTime : Form
{
    private DateTime timerEnd;

    public void TimerStart()
    {
        timerEnd = DateTime.Now.AddMilliseconds(timer.Interval);
        timer.Start();
    }

    public TimeSpan GetRemaining()
    {
        return timerEnd - DateTime.Now;
    }

    private void timer_Tick(object sender, EventArgs e)
    {
        // Do your thing
        timerEnd = DateTime.Now.AddMilliseconds(timer.Interval);
    }
}

Honnêtement, je ne vois pas l'intérêt d'utiliser l'option Stopwatch . Vous avez en fait besoin de moins de lignes en utilisant un DateTime . De plus, cette dernière me semble un tout petit peu plus claire.

0voto

Tiago Almeida Points 31

J'ai trouvé une solution qui est assez simple :

1 - Avant de lancer la minuterie, j'enregistre l'heure actuelle dans la mémoire de l'appareil. TotalMillisseconds (de la DateTime.Now.TimeOfDay.TotalMilliseconds ):

double _startingTime = DateTime.Now.TimeOfDay.TotalMilliseconds;

2 - Chaque fois que la minuterie se déclenche, j'obtiens à nouveau l'heure actuelle, puis j'utilise la fonction double pour obtenir la différence entre les deux :

double _currentTime = DateTime.Now.TimeOfDay.TotalMilliseconds;
double _elapsed = _currentTime - _startingTime;

if(_elapsed >= 500)
{
    MessageBox.Show("As you command, master!");
    _startingTime = _currentTime;
}

if(_currentTime < _startingTime)
    _startingTime = _currentTime;

3 - Et enfin, parce que le TotalMilliseconds renverra le nombre de millisecondes qui se sont écoulées depuis 00:00 (12 heures), ce qui signifie que lorsqu'il est minuit, la fonction TotalMilliseconds sera égal à 0. Dans ce cas, je vérifie simplement si le _currentTime est inférieure à la _startingTime et, si c'est le cas, définir le _startingTime à la _currentTime pour que je puisse calculer à nouveau.

J'espère que cela vous aidera

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X