LeSpleen
Messages postés4Date d'inscriptionvendredi 11 août 2006StatutMembreDernière intervention17 août 2006
-
11 août 2006 à 13:24
LeSpleen
Messages postés4Date d'inscriptionvendredi 11 août 2006StatutMembreDernière intervention17 août 2006
-
17 août 2006 à 12:57
Bonjour à tous
Voila mon problème:
Je dois afficher une série d'images à une fréquence déterminée (10images/sec).
Pour cela, j'ai créer 2 threads:
-le premier rempli un buffer (taille fixée à 25 images pour des
raisons de mémoire) avec des images que j'ai pris le soin de charger
(MediaTracker)
-le deuxième thread extrait une image du buffer et la transmet au canva en lui disant de la dessiner.(boucle avec la fréquence de rafraichissement)
Au début tout va bien mais au bout de quelques images, il y a
ralentissement de l'affichage vu que le buffer se vide plus vite qu'il
ne se remplie.
Voici un bout de code:
Le thread chargé de l'affichage:
public void run() {
LeSpleen
Messages postés4Date d'inscriptionvendredi 11 août 2006StatutMembreDernière intervention17 août 2006 11 août 2006 à 15:23
Merci Twinuts
J'ai essayé ton idée en ajoutant des wait() et notify() dans ces fonctions.
J'obtient sensiblement le même résultat qu'en mettant synchronized pour
ces même méthodes: toute la séquence s'affiche mais la vitesse de
rafraichissement est vraiment trop lente... :(
Twinuts
Messages postés5375Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention14 juin 2023111 11 août 2006 à 16:02
Salut,
essaye ça pour voir :
public synchronized void run() {
System.out.println("Début Afficheur");
Image image=null;
if(buffer==null){
System.out.println("Buffer d'image non initialisé !");
return;
}
while(makingVideo){
try{
wait();
}catch(Exception e){
}
image = buffer.getNextImage();
if((image==null)&&(!bufferRunner.isAlive())){
//Fin de la vidéo
makingVideo = false;
return;
}
canva.set_image(image);//L'image est transmise au canva puis déssinée
for(int i=0;i<nbParam;i++){
((MyGraphicPanel)panelVector.elementAt(i)).goToNextPoint();
}
}
buffer.killThread();//Arret du remplissage
System.out.println("Fin Afficheur");
}
public synchronized wakeUp(){
notify();
}
et dans le thread de remplissage tu fais appel à la methode wakeup une foir que le boulot est fait apres si tu as toujour des ralentissement cela peut venir du mediatraker qui prend trop de temps donc essai si tu peux de le remplacer par
new ImageIcon(im).getImage() ce qui peut prendre moins de temps bien que je n'en soit pas à 100% certain
... de cette façon, l'objet ou les threads sont mis en attente est le
buffer puisque ces 2 fonctions sont appellées dans ce dernier.
getNextImage() est appellée par le thread qui affiche
addImageToBuffer(int index) est appellée par le thread qui rempli le buffer
Cette solution est équivalente à la précédente je pense, c'est juste
que l'objet sur lesquels sont fait les notify() et les wait() sont
différents.
Finalement j'ai toujours les ralentissements (et l'exécution des thread
semble resté séquencielle: un remplissage, un affichage...).
Je ne peux pas utiliser ImageIcon(im).getImage() car le format
des images n'est pas pris en charge par Java (des images au format TIFF
sont possibles). Le problème ne semble pas venir de la librairie que
j'ai utilisé car j'ai testé avec des images PNG (donc sans utilisé la
librairie pour les images TIFF) et j'obtient le même résultat.
Le problème dois venir du MediaTracker. N'y a t-il pas moyen de le rendre plus rapide ? ou quelqu'un a t-il une autre solution ?
Merci de votre aide.
Vous n’avez pas trouvé la réponse que vous recherchez ?
LeSpleen
Messages postés4Date d'inscriptionvendredi 11 août 2006StatutMembreDernière intervention17 août 2006 17 août 2006 à 12:57
Re,
Je viens d'essayer et il n'y a pas de changements visibles (je n'ai pas
vérifié les temps d'exécution, j'ai juste regarder la séquence). Il
faut croire qu'il est inutile ici, peut etre que le chargement de
l'image se fait lors de l'appelle de la fonction ToolkitLoader.loadViaToolkitOrCodecs( ).
En fait, je pense que le problème dois venir de l'enchainement des
threads puisque lorsque le remplissage est fini, arrêt du thread de
remplissage, le buffer contient N images et leur affichage se fait
correctement (la fréquence de rafraichissement s'accélère). Sinon en
tant normal, l'exécution des threads semble être séquentiel, en mettant
des prinln() on obtient :