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
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
A voir également:
- Temporisation en nanosecondes en C, Windows CodeBlocks
- Clé windows 10 gratuit - Guide
- Montage video windows - Guide
- Windows ne démarre pas - Guide
- Codeblocks avec compilateur - Télécharger - Langages
- Windows 10 gratuit - Accueil - Mise à jour
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
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,
Par contre,
Sous Windows, par
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
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
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
2 déc. 2015 à 12:01
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.
3 déc. 2015 à 22:05