Bonjour,
pour une appli en C/C++, j'aurais besoin qu'un thread se mette en pause pour une durée courte (1,2,5 ou 10ms) de facon fiable. Mon but étant de faire un simulateur, cette précision est importante.
En faisant des tests avec des fonctions qui regarde l'heure :
Je vois qu'un sleep(1) dure environs 1.8 ms (l'appel de la fonction current_time est négligeable, de l'ordre de la centime de millisecondes)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 static LARGE_INTEGER freq; static bool init_fq(false); double current_time() { if (!init_fq) { QueryPerformanceFrequency(&freq); init_fq = true; } QueryPerformanceCounter(&count); return static_cast<double>(count.QuadPart) / freq.QuadPart; } void attendre(unsigned long time){ double start = 1000*current_time(); // en millisecondes. Sleep(1); printf("TIME after: %f\n",1000*current_time()-start); }
un Sleep(2) dure 2.8ms également en moyenne (avec des rares pointes à 17-33ms).
J'ai lu de nombreuses fois sur le net que les sleep courts sont imprécis (et je l'ai bien constaté) puisqu'ils bloquent le thread pour une durée minimale.
Pour contourner ce problème, j'ai essayé un truc du genre :
J'arrive à obtenir des temps d'attentes tout à fait raisonnables (1.00ms) et assez stable, mais j'ai également des pointes ponctuelles au dela des 10-20ms d'attentes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 void attendre(unsigned long time){ double start = 1000*current_time(); // en millisecondes. SetThreadPriority(GetCurrentThread(),15); while (1000*current_time() < (start+time)){ } SetThreadPriority(GetCurrentThread(),0); printf("TIME after: %f\n",1000*current_time()-start); }
Le fait de changer de priorité le thread n'a en fait que peu d'influence, surtout que le but n'est pas de bloquer le reste de la machine sur laquelle tourne une application serveur video et une socket de réception sur un thread parallèle.
J'ai meme essayé de combiner un Sleep(1) puis while (1000*current_time() < (start+time)) (pour une attente de 2ms par exemple..) Là encore je suis la plupart du temps stable, mais avec les mêmes pointes.
Y a-t-il une solution pour éviter d'avoir des pointes d'attentes si élevée ou moins fréquement?
Le fait d'avoir 3 choses qui tournent en même temps sur le pc (Win XPau passage) est surement une des clés du problèmes, mais pas de la solution.
Passer sur un ensemble complètement linéaire (serveur+socket+appli en un seul thread) résoudrait-il le problème?(ou alors de toute facon, le fait d'avoir windows et n'importe quoi derrière ca plante tout..?)
Partager