Temporisation en nanosecondes en C, Windows CodeBlocks

leandro95 Messages postés 82 Statut Membre -  
leandro95 Messages postés 82 Statut Membre -
Bonjour,

J'aimerai savoir comment temporiser un programme avec des nanosecondes en C sous windows ( via CodeBlocks ) car la fonction Sleep utilise que des nanosecondes.

1 réponse

  1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    Salut leandro95,

    J'aimerai savoir comment temporiser un programme avec des nanosecondes en C sous windows ( via CodeBlocks ) car la fonction Sleep utilise que des nanosecondes.

    Il y a un problème dans ta question...

    En tout état de cause,
    sleep()
    ou
    Sleep()
    ne sont pas des fonctions du C standard.

    Par contre,
    sleep()
    est une fonction POSIX accessible par
    #include <unistd.h>
    . Si tu utilises cette fonction, son prototype est
    unsigned int sleep(unsigned int seconds);
    et tu passes donc des secondes.

    Sous Windows, par
    #include <windows.h>
    , tu peux accéder à une autre fonction
    Sleep()
    , qui, elle prend des millisecondes, et dont le prototype à la sauce Microsoft est :

    VOID WINAPI Sleep(
      _In_ DWORD dwMilliseconds
    );
    

    https://docs.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-sleep?redirectedfrom=MSDN

    Ni l'une, ni l'autre n'ont une résolution de l'ordre de la nanoseconde (10 puissance -7 seconde). La milliseconde, c'est "seulement" un millième de seconde (10 puissance -3 seconde).

    Sur une machine Windows, c'est déjà pas mal et il ne faut pas espérer avoir une précision réelle à la milliseconde près.

    Si tu veux sous Windows une résolution de l'ordre de la nanoseconde, tu peux essayer
    QueryPerformanceCounter()
    :

    https://docs.microsoft.com/en-us/windows/win32/api/profileapi/nf-profileapi-queryperformancecounter?redirectedfrom=MSDN
    et lire :
    https://docs.microsoft.com/en-us/windows/win32/sysinfo/acquiring-high-resolution-time-stamps?redirectedfrom=MSDN
    https://stackoverflow.com/questions/1739259/how-to-use-queryperformancecounter
    https://stackoverflow.com/questions/13610471/calculating-function-time-in-nanoseconds-in-c-code

    Dal
    0
    1. rdany62 Messages postés 14 Statut Membre
       
      Bonjour,

      juste pour préciser, concernant Sleep(int millisec), on n'a même pas une résolution de 1 milliseconde (ms), mais plutôt 16 msec. Et encore, c'est assez dépendant du matériel.

      Le seul compteur qui puisse avoir une résolution suffisante pour créer un compteur fonctionnant à une résolution de quelques centaines de nano sec (ns), sur les processeurs compatibles x86, c'est le Time Stamp Counter, qui s'incrémente à chaque front d'horloge du processeur.
      Et il n'est accessible directement qu'en mode noyau, donc uniquement quand on écrit certains types de pilotes/services, donc pas par une application de bureau.
      Lorsque l'on tente d'y accéder directement en assembleur avec l'instruction RDTSC sous Windows, cette instruction lève une exception, qui est interceptée par Windows, qui va donner la dernière valeur qu'il a lue en utilisant lui-même cette instruction, et cela avec un délai non maitrisable.

      Voici un article MSDN sur les timers de précision (en Anglais car non dispo en Français): https://docs.microsoft.com/en-us/windows/win32/sysinfo/acquiring-high-resolution-time-stamps?redirectedfrom=MSDN
      Si tu n'es pas en train d'écrire un pilote en mode noyau, tu peux ne pas tenior compte des fonctions commençant par "Ke", celles-ci ne sont utilisables que pour ce type de programme.

      Enfin, et pour être un peu complet, les timers multimédias de Windows sont assez chiants à mettre en œuvre car il peut y avoir une gigue assez importante, et il semblerait qu'ils deviennent obsolètes.
      0
    2. leandro95 Messages postés 82 Statut Membre
       
      Merci à vous deux pour vos réponses je vais étudier ces solutions
      0