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 :
- while(1) {
- Sleep(dwTimeRefresh);
- pEngine->SendTrame();
- }
|
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 :
- void SafeSleep(DWORD dwMilliSeconds) {
- DWORD dwCumul = 0;
- DWORD dwTodo = dwMilliSeconds;
- while ( (dwCumul < dwTimeRefresh) && (dwToto > ATOMIC_TIME) ) {
- Sleep(ATOMIC_TIME);
- dwCumul += ATOMIC_TIME;
- dwToto -= ATOMIC_TIME;
- }
- if (dwTodo > 0) { // ici dwTodo est compris entre 0 et ATOMIC_TIME
- Sleep(dwTodo);
- dwCumul += dwTodo;
- dwTodo = 0;
- }
- }
|
(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