Sleep dans les thread java

Sleep dans les thread java - Java - Programmation

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

Marsh Posté le 27-10-2005 à 22:30:36   

Reply

Marsh Posté le 27-10-2005 à 23:25:16    

pdufranc a écrit :

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


 
Tu peux nous dire comment tu as teste ?

Reply

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

Reply

Marsh Posté le 28-10-2005 à 09:16:48    

pdufranc a écrit :

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


Si tu veux de la précision à la milliseconde près ca va être chaud en Java, surtout si tu fait du multi-threading


---------------
Light is right
Reply

Marsh Posté le 28-10-2005 à 09:51:23    

je serais curieux de voir le code [:pingouino]

Reply

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.

Reply

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.


---------------
Voir les RAW sous Android: https://market.android.com/details? [...] .RawVision Blog Photo: http://photouch.me Applications mobiles: http://caketuzz.com Wapcam Project: http://wapcam.mobi
Reply

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é.
;)


---------------
"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)
Reply

Marsh Posté le 02-11-2005 à 18:16:29    

pdufranc a écrit :

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é.
;)


 
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 :
  1. date1=System.getDate(); //Oui je sais je connais plus le nom de la méthode
  2. while(System.getDate() - date1 <maDuree)
  3. {
  4.      try{Thread.Sleep(1);}catch(){}
  5. }


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


---------------
Voir les RAW sous Android: https://market.android.com/details? [...] .RawVision Blog Photo: http://photouch.me Applications mobiles: http://caketuzz.com Wapcam Project: http://wapcam.mobi
Reply

Marsh Posté le 02-11-2005 à 18:22:54    

Thread.sleep(1) => autant faire un busy wait, tant qu'on y est. [:pingouino]
 
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.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 02-11-2005 à 18:22:54   

Reply

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. [:pingouino]
 
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.


 
 
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?

Reply

Sujets relatifs:

Leave a Replay

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