Sleep dans les thread java - Java - Programmation
Marsh Posté le 27-10-2005 à 23:25:16
pdufranc a écrit : Bonjour |
Tu peux nous dire comment tu as teste ?
Marsh Posté le 28-10-2005 à 00:06:36
J'ai une appli qui tourne avec plusieurs threads et sur un apres ces instructions; je recupere le temps avant le sleep et celui apres et je calcul la différence
Marsh Posté le 28-10-2005 à 09:16:48
pdufranc a écrit : Bonjour |
Si tu veux de la précision à la milliseconde près ca va être chaud en Java, surtout si tu fait du multi-threading
Marsh Posté le 29-10-2005 à 18:22:10
Désolé pdufranc, mais le java ne fait pas du temps-réel, et la fonction sleep te garantit simplement que le sleep fera au moins 2ms, rien de plus.
Marsh Posté le 02-11-2005 à 15:36:17
post_it a écrit : Désolé pdufranc, mais le java ne fait pas du temps-réel, et la fonction sleep te garantit simplement que le sleep fera au moins 2ms, rien de plus. |
Une technique que tu peux utiliser, c'est de sauvegarder la date au début de ton process.
Quand tu arrives à la fin, tu regardes si le temps écoulé est inférieur à la période que tu as fixée ( rafraichissemnt des frames par exemple) Si c'est le cas, tu px fair un sleep de la différence, autrement si on a dépassé le temps, pas de sleep, et on recommence.
De cette façon, qd les threads sont plus courts, on attend, et qd ils sont plus lents, on tolère ce dépassement.
Sinon fais bien attention aux instructions que tu places entre tes deux relevés de date, tu dois avoir le minimum pour être sur de mesurer le Sleep() le + précisément possible.
Marsh Posté le 02-11-2005 à 17:45:24
wapcamer :
C'est ce que je fais deja. Et quand je mesure par ce procede le temps mis par le Sleep, il est tres souvent supérieur au temps demandé.
Marsh Posté le 02-11-2005 à 18:16:29
pdufranc a écrit : wapcamer : |
Il y a 2 choses à voir: la durée de chaque cycle, et la durée du Thread.Sleep()
Je te conseille donc de faire un System.out a l'entrée de chaque boucle, et d'encadrer ton Sleep par 2 appels à getDate();
De cette façon, tu pourras avoir la durée du sleep et la durée recommandée pour le sleep.
DateD0 Traitement DateD1 Sleep DateD2 T1= Fin de la boucle
.|------------------------------>---------->--------->-------|
Un bon shéma.....
Ainsi avec D°, D1, D2, tu peux deja verifier que D0+Sleep = T1 à peu près
et que D2-D1= Sleep
Si ce n'est pas le cas, il faut traiter les choses staitistiquement:
soit tu fais un grand nombre d'essais et à partir de là, tu essayes d'extrapoler une loi sur la durée du Sleep par rapport à la valeur qui est entrée, de cette façon tu pourras corriger la valeur d'entrée de la fonction sleep() en fonction de la valeur que tu espères.
Mais bon à mon avis, ça ne donnera pas gdchose mais au moins ça te permettra de voir sile delai du Sleep est aléatoire ou pas.
Tiens une autre idée qui me vient comme ça, si tu remplaces ton Sleep(durée) par une boucle de Sleeps, par exemple, au lieu de
Thread.Sleep(maDuree);
Code :
|
Le pb c que sur des durées de l'ordre de la ms, je sais pas si ca peut aider.
Tiens nous au courant
Marsh Posté le 02-11-2005 à 18:22:54
Thread.sleep(1) => autant faire un busy wait, tant qu'on y est.
Mesurer le temps qu'a mis le sleep sur des petites valeurs : hot hot hot.
Essayer d'en déduire le temps qu'il reste à attendre ou le dépassement : ça devient carrément olé. Le temps de prendre la mesure ET de faire une comparaison, et une valise de ms se sont presque écoulées...
Je suis plus que sceptique.
Marsh Posté le 02-11-2005 à 21:34:49
sircam a écrit : Thread.sleep(1) => autant faire un busy wait, tant qu'on y est. |
hey, c pas pour mesurer le sleep sur de petites valeurs, c juste pour approcher la fin de la période du cycle sans trop d'écart.
Prendre la mesure ne doit pas être tellement long, c juste une copie de registre, pareil pour le calcul mathématique dc je suis pas sur qu'on n'ait pas une résolution à 2ms. En fait ça doit ss doute dépendre aussi de la charge CPU.
Essayer est encore la meilleure façon de s'en rendre compte.
Et toi que proposes-tu?
Marsh Posté le 27-10-2005 à 22:30:36
Bonjour
Je viens de faire des tests sur la precisions d'un sleep java et c'est pas bon, c'est à dire un sleep de 2 ms fait 16 ms
Qu'est ce que je peux utiliser comme timer pour avoir un sleep plus precis
Merci d'avance
---------------
"Placez votre main sur un poele une minute et ça vous semble durer une heure. Asseyez vous aupres d'une jolie fille une heure et ça vous semble durer une minute. C'est ça la relativite." (Albert Einstein / 1879-1955)