2 votes

le timer c# n'est pas précis ?

J'ai une fonction qui doit envoyer un signal après un intervalle spécifique, précis à 1 milliseconde (ms). Mais il semble que mon timer ait besoin d'un peu plus de temps qu'il ne devrait, c'est-à-dire que je passe à la fonction un TimeSpan de 20 ms mais le timer a besoin de 30 ms par tic. J'ai maintenant écrit un timer moi-même avec un Stopwatch mais je me demande toujours pourquoi le timer a besoin de plus de temps pour s'exécuter ?

private System.Timers.Timer timer;

private void startResetTimer(TimeSpan time)
{
    timer = new System.Timers.Timer(time.TotalMilliseconds);
    timer.Elapsed += OnTimedEvent;
    timer.AutoReset = true;
    timer.Enabled = true;
}

private void OnTimedEvent(Object source, ElapsedEventArgs e)
{
    if (!waitForTimerReset.Set())
        Console.WriteLine("Could not wake up any threads!");
}

Dans mon code, la seule chose que le timer exécute est la fonction waitForTimerReset.Set() Méthode qui permet aux Threads de continuer après qu'ils aient été arrêtés par un ManualResetEvent ce qui signifie que cet appel ne devrait pas prendre 10 ms.

7voto

Patrick Hofman Points 22166

Non. Le chronomètre n'est pas du tout précis. Ce n'est pas son but. Il prendra au moins le temps que vous avez défini comme intervalle.

Le "problème" est le suivant : le thread sur lequel le timer fonctionne est parqué après que le tick se soit produit. Ensuite, le processeur effectue un autre travail et revient après un certain temps lorsque ce travail est terminé et effectue le prochain tick. C'est pourquoi ces minuteurs ne sont pas précis.

Pour résoudre ce problème, vous pouvez parfois calculer la différence entre le début et le moment présent et l'utiliser au lieu de compter les ticks.

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