IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

2 threads d'affichage swing


Sujet :

AWT/Swing Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 30
    Par défaut 2 threads d'affichage swing
    Bonjour a tous,

    voici mon probleme,

    je realise un programe comportant 3 thread.
    Le premier Thread est un simple timer.
    A chaque nouveau cycle de ce timer, les 2 autres thread (notés Ta et Tb) affichent des objets en swing.

    Ta affiche un objet qui peut etre assimilé a une progresse bar, son affichage est peu gourmant, mais il doit absolutment "avancer" de facon reguliere. etre synchrone avec le timer.

    Tb affiche bcp plus de choses a chaque cycle. Le probleme etant que ce thread ralenti l'execution de l'autre thread (Ta).
    L'ideal serait que ce second thread ne se mette pas a jour a chaque cycle, mais seulement de temps en temps pour laisser le premier thread (Ta) progresser normalement.

    Merci pour votre aide !

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 913
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 913
    Billets dans le blog
    54
    Par défaut
    Peux-tu nous montrer du code sur comment tu as implemente tout ca s'il te plait ?

    De plus en comptant l'EDT, l'Event Dispatch Thread, la thread d'affichage AWT/Swing il faut compter 4 Thread et non pas 3. Enfin, je te rappelle que les composants Swing doivent etre manipules durant l'EDT uniquement.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 30
    Par défaut
    Merci pour ton aide !
    En fait j'ai un peu fais évoluer le code (sans meilleur resultat).
    J'utilise la classe Timer de Swing.

    voila ce qu'il en ai aujourd'hui

    la méthode "principale" ou tout se passe :


    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    public vois play(){
     
    //Ce player est un player de clip audio
    player.init(offset);
     
    new Thread(new Runnable() {
    	public void run() {
    		player.play();
    		while ((player.getClip().isRunning()) 
    			;
    		}
    }).start();
     
    new Thread(new Runnable() {
    	public void run() {
    		while (.en on est lecture..) 
                    {
    		//mise a jour de la frame courrante	
                    current_frame++;
    		try {
    			Thread.sleep(66);
    		     } catch (InterruptedException e) {
    			e.printStackTrace();
    		     }
                    }
    }).start();
     
     
     
    AnimationTimer timer = new AnimationTimer(66);
    timer.startAnimation();
    }

    et la classe AnimationTimer :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    public class AnimationTimer implements ActionListener {
     
    	Timer timer;
     
     
     
    	AnimationTimer(int delay) {
     
     
    		timer = new Timer(delay, this);
    		timer.setInitialDelay(0);
    		timer.setCoalesce(false);
     
    	}
     
     
    	public void startAnimation() {
     
    			// Start animating!
    			if (!timer.isRunning()) {
    				timer.start();
    			}
     
    	}
     
    	// Can be invoked by any thread (since timer is thread-safe).
    	public void stopAnimation() {
    		// Stop the animating thread.
    		if (timer.isRunning()) {
    			timer.stop();
    		}
    	}
     
    	public void actionPerformed(ActionEvent e) {
    		// Advance the animation frame.
     
     
    // CE REPAINT NE FAIS PAS GRAND CHOSE, J'AIMERAI QU'IL SOIT FLUIDE
    		Panel1.repaint() 
    // CE REPAINT EST TRES GOURMAND EN RESSOURCE, J'AIMERAI QU'IL NE SOIT PAS FLUIDE, QUIT A SAUTER DES CYCLE
    		Panel2.repaint();
    	}
     
    }

    merci d'avoir lu ce bazar

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 30
    Par défaut
    en fait avant j'avais creer dans la methode "play" 2 autres threads, chacune appelant panel1.repaint() ou panel2.repaint() a intervalle regulier... sans meilleurs resultats.

  5. #5
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Suis les conseils de bouye, et cela devrait aller mieux.

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 913
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 913
    Billets dans le blog
    54
    Par défaut
    Si le rendu est lent alors deja il faut appeler repaint() moins souvent sur ce composant-la. Tu peux en outre le dessiner uniquement quand c'est vraiment necessaire dans une BufferedImage qui sera elle composee a l'ecran a chaque repaint() (comme ca c'est plus rapide). Enfin dois-tu vraiment faire un repaint() complet du composant ? Ca serait pas plutot mieux en calculant la zone necessaire a repeindre et ensuite d'appeler repaint(x, y, w, h) ?
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 30
    Par défaut
    Merci
    En fait, concernant le repaint gourmand, je le rends deja dans un Bufferedimage, et de plus je suis toujours obligé de dessiner la quasi totalité du composant. Donc je ne ganerai pas grand chose a definir une bounding box...
    Bien sur je pourrais peindre ce composant moins souvant.
    Mais ce que je voudrait c'est desynchroniser les 2 rendus, pour que le repaint leger se fasse de maniere fluide...
    Je pense pas que ce soit possible enfait, vue qu'il doivent tous deux synchronisés sur l'EDT... ai-je bien compris ?

  8. #8
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 913
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 913
    Billets dans le blog
    54
    Par défaut
    Oui, cependant il est peut-etre possible de faire des optimisations en ecrivant ton propre repaint manager (et la ca sort de mon domaine de competences). Sinon arrange-toi simplement pour appeler repaint() sur ce second composant moins souvent, par exemple en fonction du temps ecoule depuis le dernier appel.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 30
    Par défaut
    Citation Envoyé par bouye Voir le message
    Sinon arrange-toi simplement pour appeler repaint() sur ce second composant moins souvent, par exemple en fonction du temps ecoule depuis le dernier appel.
    yep, ca me parrait etre la meilleure solution

    merci d'avoir pris le temps en tout cas.

    a plus

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Thread et actualisation de l'affichage swing
    Par Pirokkk dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 28/12/2007, 20h41
  2. [1.1] Comment accéder au thread d'affichage ?
    Par fregolo52 dans le forum Framework .NET
    Réponses: 1
    Dernier message: 20/09/2006, 12h27
  3. Obtenir la taille d'un composant d'affichage Swing
    Par jbwan dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 08/06/2006, 10h25
  4. [MFC] thread d'affichage
    Par Joeleclems dans le forum MFC
    Réponses: 31
    Dernier message: 23/05/2005, 15h47
  5. Thread et affichage direct3D plein écran
    Par Harry_polin dans le forum DirectX
    Réponses: 8
    Dernier message: 13/03/2003, 23h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo