Mesure temporelle précise [Résolu]

brixi69 44 Messages postés mardi 13 juin 2006Date d'inscription 31 mars 2008 Dernière intervention - 1 sept. 2006 à 16:06 - Dernière réponse : hyperion56 5 Messages postés mercredi 21 mai 2008Date d'inscription 15 décembre 2010 Dernière intervention
- 23 juil. 2009 à 16:59
Bonjour !

J'aimerais faire un échantillonnage sur le CTS d'un port COM à la µseconde près si c'est possible. Seulement je sais qu'il est difficile d'y arriver de part les interrupts windows etc...

Qqun a-t-il une solution pour m'aider ?

@"#+++
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 5 sept. 2006 à 05:45
3
Merci
Non, StopWatch est un wrapper pour QueryPerformanceFrequency et QueryPerformanceCounter si le matériel supporte ces deux fonctions alors la précision est nettement inférieur à la milliseconde sinon c'est DateTime.Ticks qui est utilisé.

Une petite classe que j'avais fait avant .NET 2.0. En fait Microsoft m'a piqué mon code.

public sealed class HighTimer // .NET 1.1
{
    [System.Runtime.InteropServices.DllImport( "kernel32.dll"/*, SetLastError = true*/ )]
    [System.Security.SuppressUnmanagedCodeSecurity]
    private static extern bool QueryPerformanceFrequency( out long frequency );



    [System.Runtime.InteropServices.DllImport( "kernel32.dll"/*, SetLastError = true*/ )]
    [System.Security.SuppressUnmanagedCodeSecurity]
    private static extern bool QueryPerformanceCounter( out long count );



    [System.Runtime.InteropServices.DllImport( "winmm.dll" )]
    [System.Security.SuppressUnmanagedCodeSecurity]
    private static extern uint timeGetTime( );



    private bool high = false;
    private long ticks = 0;
    private long ticksPerSecond = 0;



    /// <summary>
    /// Indique si le timer est un timer de haute résolution.
    /// </summary>
    public bool HighResolution { get { return high; } }



    /// <summary>
    /// Nombre de graduations par milliseconde.
    /// </summary>
    public long TicksPerSecond { get { return ticksPerSecond; } }



    /// <summary>
    /// Nombre de graduations écoulées depuis le démarrage de Windows.
    /// </summary>
    public long Ticks
    {
        get
        {
            if ( high )
                QueryPerformanceCounter( out ticks );
            else
                ticks = ( long )timeGetTime( );



            return ticks;
        }
    }



    public HighTimer( ) : this( true ) { }



    /// <summary>
    /// Créer un timer haute résolution uniquement si le matériel supporte cette fonctionnalité.
    /// Dans le cas contraire le timer sera limité à 1000 graduations par seconde.
    /// </summary>
    public HighTimer( bool highResolution )
    {
        if ( highResolution )
            high = QueryPerformanceFrequency( out ticksPerSecond );



        if ( !high )
            ticksPerSecond = 1000L;



        this.ticks = this.Ticks; // JIT
    }
}

Merci Lutinore 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de Lutinore
brixi69 44 Messages postés mardi 13 juin 2006Date d'inscription 31 mars 2008 Dernière intervention - 1 sept. 2006 à 16:31
0
Merci
Je pensais utiliser QueryPerformanceCounter/frequency etc ....

Bonne idée ?

MErci encore ;-)

@"#+++
Commenter la réponse de brixi69
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 4 sept. 2006 à 04:14
0
Merci
Salut,

oui, en NET 2.0 ces 2 fonctions sont encapsulées dans la classe StopWatch.
Commenter la réponse de Lutinore
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 4 sept. 2006 à 08:46
0
Merci
Lutinore> La stopwatch se limite aux milisecondes non? Je ne crois pas qu'il y ait un moyen de mesurer des temps en dessous de la milliseconde....

<hr size="2" />VC# forever
Commenter la réponse de cs_Bidou
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 5 sept. 2006 à 09:41
0
Merci
Donc dans la StopWatch, si je veux mesurer un temps en dessous de la miliseconde, j'utilise la Property Ticks? Si oui, comment savoir à combien équivaut un ticks ?

<hr size="2" />VC# forever
Commenter la réponse de cs_Bidou
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 5 sept. 2006 à 15:38
0
Merci
En nanoseconde, je sais pas, c'est toi qui est bon en math.  Mais peu importe en fait.. un tick c'est un tick car stopwatch permet de mesurer un interval de temps sur un ordinateur donné, telle action prends 10000 ticks et une autre 20000.

ou bien

// temps écoulé sous forme de seconde fractionnaire.
MessageBox.Show( ( sw.ElapsedTicks / ( double )Stopwatch.Frequency ).ToString( ) );
Commenter la réponse de Lutinore
brixi69 44 Messages postés mardi 13 juin 2006Date d'inscription 31 mars 2008 Dernière intervention - 5 sept. 2006 à 16:45
0
Merci
Exact !
Merci pour les infos

J'ai trouvé également quelques explications sur le site MSDN ...
> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/scalenethowto09.asp

Une dernière chose. Serait il possible de créer une sorte de Timer haute résolution qui lors d'un Time-out donné permettrait de lancer un évenement ?

@"#+++
Commenter la réponse de brixi69
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 5 sept. 2006 à 18:27
0
Merci
Lutinore> Ok, ce que je connaissais pas (ou que j'avais pas encore découvert en fait) c'est l'existance de la Property static Frenquency. Avec ça, plus de problème, on peut sans autre savoir à quoi équivaiut un tick. Pour information à ceux qui ne le save pas :

"La valeur Frequency dépend de la résolution du mécanisme de minutage sous-jacent. Si le matériel et le système d'exploitation installés prennent en charge un compteur de performance haute résolution, la valeur Frequency reflète par conséquent la fréquence de ce compteur. Sinon, la valeur Frequency est basée sur la fréquence de l'horloge système." (msdn2)

J'ai fait un rapide teste chez moi pour savoir autour de quelle valeur on tournait :

long freq = System.Diagnostics.
Stopwatch.Frequency;

long nanoInSeconds = 1000000000L;

long val = freq / nanoInSeconds;

La valeur est de 2.6, c'est à dire que chaque ticks à lieu toute les 2.6 nanoseondes!
Et bien, c'est sacrément plus précis que ce que je pensais cette histoire...

<hr size="2" />VC# forever
Commenter la réponse de cs_Bidou
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 5 sept. 2006 à 18:53
0
Merci
Euh non, ça veut dire que y'a 2.6 ticks par nanosecondes !
Ca ferait un tick toutes les 384 picosecondes ce qui me paraît presque impossible

<hr size="2" />VC# forever
Commenter la réponse de cs_Bidou
hyperion56 5 Messages postés mercredi 21 mai 2008Date d'inscription 15 décembre 2010 Dernière intervention - 23 juil. 2009 à 16:24
0
Merci
> Bidou

Salut,

Je déterre ce vieux topic, désolé...

Je pense qu'il faut corriger le calcul ci-dessus.
En effet, pour connaître la période en secondes entre deux ticks, on prend l'inverse de la fréquence. Puis, on multiplie par 10^9 pour avoir la période en nanosecondes.

D'où ce code :

long frequence = Stopwatch.Frequency;
long periode = 1000000000L / frequence;
Console.WriteLine("période d'un tick = " + periode + " nanosecondes");


Sur ma machine je trouve un tick toutes les 279 nanosecondes.

Ai-je fait une erreur ?

Cordialement,

Jonathan
Commenter la réponse de hyperion56
hyperion56 5 Messages postés mercredi 21 mai 2008Date d'inscription 15 décembre 2010 Dernière intervention - 23 juil. 2009 à 16:38
0
Merci
Oups, j'ai vu dans ce topic que Brixi69 a déjà rectifié l'erreur.

Cordialement,
Commenter la réponse de hyperion56
hyperion56 5 Messages postés mercredi 21 mai 2008Date d'inscription 15 décembre 2010 Dernière intervention - 23 juil. 2009 à 16:59
0
Merci
D'ailleurs, j'ai fait la vérification suivante :

Stopwatch test = new Stopwatch();
// lancement du chrono
test.Start();
Thread.Sleep(1000);
// arrêt du chrono
test.Stop();

// durée mesurée en millisecondes
Console.WriteLine("millisecondes = " + test.ElapsedMilliseconds);
// durée mesurée en ticks
Console.WriteLine("ticks = " + test.ElapsedTicks);

// pour convertir les millisecondes en nanosecondes on multiplie par 10^6
// puis on divise par le nombre de ticks pour connaître la période d'un tick
long resultat = test.ElapsedMilliseconds * 1000000L / test.ElapsedTicks;

Console.WriteLine("période d'un tick = " + resultat + " nanosecondes");


Cdt,

Jonathan
Commenter la réponse de hyperion56

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.