Classe pour un timer

Signaler
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020
-
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
-
Salut

que pensez de ma classe Timer ..je suis partis d'une classe que j'ai trouve sur le site ...

using System;
using System.Runtime.InteropServices;
using System.ComponentModel;
using System.Threading;

namespace Fonctions_Time
{
    internal class HiPerfTimer
    {
        [DllImport("Kernel32.dll")]
        private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);

        [DllImport("Kernel32.dll")]
        private static extern bool QueryPerformanceFrequency(out long lpFrequency);

        private long startTime, stopTime;
        private long freq;

        private long Freq
        {
            get
            {
                return this.freq;
            }
        }

        private long StartTime
        {
            get
            {
                return this.startTime;
            }
            set
            {
                this.startTime = value;
            }
        }

        private long StopTime
        {
            get
            {
                return this.stopTime;
            }
            set
            {
                this.stopTime = value;
            }
        }

        private static HiPerfTimer _theUniqueInstance = null;

        public static HiPerfTimer GetInstance()
        {
            //creer une nouvelle instance s il n en existe pas deja une autre
            if (_theUniqueInstance == null)
                return _theUniqueInstance = new HiPerfTimer();
            else
                return _theUniqueInstance;
        }

        // Constructor
        private HiPerfTimer()
        {
            startTime = 0;
            stopTime = 0;

            if (QueryPerformanceFrequency(out freq) == false)
            {
                // high-performance counter not supported
                throw new Win32Exception();
            }
        }

        // Start the timer
        public static void Start()
        {
            long astartTime;
            // lets do the waiting threads there work
            Thread.Sleep(0);
            QueryPerformanceCounter(out astartTime);
            HiPerfTimer.GetInstance().StartTime = astartTime;
        }

        // Stop the timer
        private static void Stop()
        {
            long astopTime;
            QueryPerformanceCounter(out astopTime);
            HiPerfTimer.GetInstance().StopTime = astopTime;
        }       

        // Returns the duration of the timer (in seconds)
        public double Duration
        {
            get
            {
                HiPerfTimer.Stop();
                return (double)(stopTime - startTime) / (double)freq;
            }
        }

        // Affiche dans la console
        private void toConsole(double theTime)
        {
            long aTime;
            QueryPerformanceCounter(out aTime);
            Console.WriteLine(" Durée : {0}  {1} sec", theTime, aTime);
        }

        // Affiche dans la console
        private void toConsole(double theTime, String theMsg)
        {
            long aTime;
            QueryPerformanceCounter(out aTime);
            Console.WriteLine(" Durée : {0}  {1} sec\t\t\t" + theMsg, theTime, aTime);
        }

        // Affiche dans la console avec restart du timer
        public static void toConsole_Restart()
        {
            HiPerfTimer.GetInstance().toConsole(HiPerfTimer.GetInstance().Duration);
            HiPerfTimer.Start();
        }

        // Affiche dans la console sans restart du timer
        public static void toConsole_Continue()
        {
            HiPerfTimer.GetInstance().toConsole(HiPerfTimer.GetInstance().Duration);
        }

        // Affiche le counter
        public static void toConsole_Counter(String theMsg)
        {
            long aTime;
            QueryPerformanceCounter(out aTime);
            HiPerfTimer.GetInstance().toConsole((double)aTime / (double)HiPerfTimer.GetInstance().Freq, theMsg);
        }
    }
}

Herve

16 réponses

Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Qu'en pensez vous ?

Herve
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
52
Salut,
Euh, et la class StopWatch alors ?!

<hr size="2" />C# forever
-Blog-
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

ah ...connais pas ....
une question j'ai rien dans la doc !!!! il y a bien une class StopWatch  mais AUCUNE fontions membre dans la doc ...

Herve
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
52
StopWatch sur MSDN












<hr size="2" />



-Blog-/FONT>
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Ah oui ...merci

sinon niveau prog c comment ?

Herve
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
52
Ben ta classe ne sert plus à rien étant donné que StopWatch fait exactement ceci...

<hr size="2" />-Blog-
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Oui mais niveau facon dont je l ai construit ...
Sinon StopWatch c fait specialment pour mesurer les temps d execution ?. c pas trop lourd ?

Herve
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
52
StopWatch est un Wrapper de QueryPerformanceCounter donc difficile de faire mieux...
En gros, la class que tu as fait est +/- la même que celle du Framework, donc pourquoi réinventer la roue !?

<hr size="2" />-Blog-
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Ahhhhh merci !!!!

Herve
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
36
Salut, niveau prog j'aurais rajouté l'attribut [System.Security.SuppressUnmanagedCodeSecurity] aux déclarations P/Invoke pour obtenir des résultats plus siginificatifs.
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Lutinore  -> Rien compris .... c'est quoi [System.Security.SuppressUnmanagedCodeSecurity] ??

Herve
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
47
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

C juste lors du debug ? c ca ?

Herve
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
47
Euh, non, je ne vois pas pourquoi ce serait que lors du debug ^^

Mx
MVP C# 
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Ben la pile des appels on l'obtient quand on met un point d'arret non ?

Herve
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
36
Non rien a voir avec le point d'arrêt.. en quelques sorte ça empêche le runtime de faire certains test de sécurité.. l'important c'est de retenir que pour tes methodes privées tu peux utiliser cet attribut pour améliorer les performances quand c'est vraiment nécessaire.