Temporisation en nanosecondes en C, Windows CodeBlocks

Fermé
leandro95 Messages postés 67 Date d'inscription vendredi 25 avril 2014 Statut Membre Dernière intervention 5 juin 2016 - 1 déc. 2015 à 20:06
leandro95 Messages postés 67 Date d'inscription vendredi 25 avril 2014 Statut Membre Dernière intervention 5 juin 2016 - 3 déc. 2015 à 22:05
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.
A voir également:

1 réponse

[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié par [Dal] le 2/12/2015 à 10:28
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
rdany62 Messages postés 12 Date d'inscription samedi 24 mars 2007 Statut Membre Dernière intervention 12 février 2016
2 déc. 2015 à 12:01
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
leandro95 Messages postés 67 Date d'inscription vendredi 25 avril 2014 Statut Membre Dernière intervention 5 juin 2016
3 déc. 2015 à 22:05
Merci à vous deux pour vos réponses je vais étudier ces solutions
0