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

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

Marsh Posté le 07-10-2003 à 11:28:02    

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 :)

Reply

Marsh Posté le 07-10-2003 à 11:28:02   

Reply

Marsh Posté le 07-10-2003 à 11:31:00    

Teste avec WaitForSingleObject


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

---------------
Le Tyran
Reply

Marsh Posté le 07-10-2003 à 13:53:37    

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
Reply

Marsh Posté le 07-10-2003 à 14:26:03    

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.

Reply

Marsh Posté le 07-10-2003 à 14:38:17    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed