Le Sleep sous windows n'est pas précis. [windows thread/processes] - C - Programmation
Marsh Posté le 07-10-2003 à 11:31:00
Teste avec WaitForSingleObject
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...
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... |
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 :
|
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.
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 :
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.
(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