Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1653 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [windows thread/processes] Le Sleep sous windows n'est pas précis.

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[windows thread/processes] Le Sleep sous windows n'est pas précis.

n°533098
xilebo
noone
Posté le 07-10-2003 à 11:28:02  profilanswer
 

Bonjour,
 
j'ai actuellement un petit souci avec le Sleep de windows. En effet, dans un thread je fais un Sleep(50) pour endormir mon thread de 50 ms mais lorsque je mesure le temps avant et apres , la difference est de 62 ms.
 
 
Pourquoi j'ai besoin de  faire ca.
 
En fait, j'ai un thread qui envoie une trame sur le port série tous les X ms. Le truc, c est que je dois pouvoir changer en temps réel cette valeur.
 
 
Ainsi dans mon thread j'ai :
 
 

Code :
  1. while(1)  {
  2. Sleep(dwTimeRefresh);
  3. pEngine->SendTrame();
  4. }


 
Le probleme c est que si je passe d'un dwTimeRefresh = 9000  à dwTimeRefresh = 1000, Le thread a été endormi 9000 ms et donc il passe à un rafraichissement de 1000 ms apres les 9000 ms. Ce n'est pas ce que je veux.
 
J'ai donc décidé de remplacer la fonction Sleep() par ma propre fonction SafeSleep() qui fait des Sleep tous les 50 ms.
 

Code :
  1. void SafeSleep(DWORD dwMilliSeconds) {
  2.    DWORD dwCumul = 0;
  3.    DWORD dwTodo = dwMilliSeconds;
  4.    while ( (dwCumul < dwTimeRefresh) && (dwToto > ATOMIC_TIME) ) {
  5.         Sleep(ATOMIC_TIME);
  6.         dwCumul += ATOMIC_TIME;
  7.         dwToto -= ATOMIC_TIME;
  8.    }
  9.    if (dwTodo > 0) { // ici dwTodo est compris entre 0 et ATOMIC_TIME
  10.        Sleep(dwTodo);
  11.        dwCumul += dwTodo;
  12.        dwTodo = 0;
  13.    }
  14. }


 
(ATOMIC_TIME vaut 50 ms)
 
Le probleme , c est quand je mesure le temps entre le debut et la fin de mon sleep, le temps n est pas respecté et plus dwMillisecon ds est grand, plus l'erreur est grande .
 
si je mesure le temps de mon Sleep(ATOMIC_TIME), il mesure en fait 62 ms. JE trouve que 20 % d'erreur de precision pour une fonction telle que celle la , c est enorme. (comparé a usleep sous linux qui marche nickel).
 
 
Existe t il une fonction ou une technique pour avoir un Sleep plus precis que ca? ou alors j'ai failli quelque part ?
 
 
 
merci :)

mood
Publicité
Posté le 07-10-2003 à 11:28:02  profilanswer
 

n°533101
LetoII
Le dormeur doit se réveiller
Posté le 07-10-2003 à 11:31:00  profilanswer
 

Teste avec WaitForSingleObject


Message édité par LetoII le 07-10-2003 à 11:31:10

---------------
Le Tyran
n°533244
HelloWorld
Salut tout le monde!
Posté le 07-10-2003 à 13:53:37  profilanswer
 

Sleep ne te garanti qu'une chose : ton thread sera endormi au moins  pendant le temps spécifié. Pour le reste, Windows n'est pas temps réel et le scheduler travaille toutes les 10 ms, donc faut pas trop espérer...
Essai d'augmenter la priorité de ton thread...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°533263
xilebo
noone
Posté le 07-10-2003 à 14:26:03  profilanswer
 

HelloWorld a écrit :

Sleep ne te garanti qu'une chose : ton thread sera endormi au moins  pendant le temps spécifié. Pour le reste, Windows n'est pas temps réel et le scheduler travaille toutes les 10 ms, donc faut pas trop espérer...
Essai d'augmenter la priorité de ton thread...


 
 
je me doute que windows n est pas temps reel... mais pourquoi tant d imprecision ? sous linux j arrive a etre plus precis.  
 
J'ai reussi a contourner ce probleme en mesurant le temps de mon sleep :
 

Code :
  1. before = timeGetTime();
  2. Sleep(ATOMIC_TIME);
  3. after = timeGetTime();


 
 
et je fais comme si mon sleep avait en fait duré after-before.
 
 
mais j'ai peur que cette méthode soit un peu barbare et ne cause des  problemes.
 
 
Avec WaitForSingleObject, je ne vois pas comment faire, et je pense qu il n est pas plus precis que Sleep.

n°533274
VisualC++
J'va y penser ...
Posté le 07-10-2003 à 14:38:17  profilanswer
 

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [windows thread/processes] Le Sleep sous windows n'est pas précis.

 

Sujets relatifs
Code source windows CE[PHP] authentifier un user windows (XP)
est-il possible de développer une appli compatible as400/Windows ?[thread/linux/c++/kdevelop3.1] Problème avec les threads
Gerer une carte sous windows 2000cryptage windows
appli python invisible dans le centre de la barre de taches windows?API Windows cryptographie
Windows, copy[Eclipse] developper sous windows, deployer sous AIX
Plus de sujets relatifs à : [windows thread/processes] Le Sleep sous windows n'est pas précis.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR