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

Concurrence et multi-thread Java Discussion :

question de débutant sur les threads


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 95
    Points : 49
    Points
    49
    Par défaut question de débutant sur les threads
    Bonjour,
    je suis novice en matière de threads. Si quelqu'un pouvait m'aider... Merci bien :
    J'ai créé une application qui lance une animation graphique. Pour cela j'ai créé un thread qui gère cette animation. C'est-à-dire pour la lancer, l'arrêter et la reprendre (en cliquant sur des boutons de ma barre d'outil).
    Seulement, quand je lance l'animation ça marche, quand je l'arrête ça marche aussi, mais quand je veux la reprendre ça plante.
    Voici le code de ma classe Thread. Les noms des méthodes sont suffisamment explicites pour se passer de commentaires. Encore merci.


    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
    public class Evolution extends Thread {
     
    	// référence à la fenetre principale de l'application
    	public Evolution(fenPrinc fp){
    		this.fp = fp;
    	}
     
    	public synchronized void anime(){
    		if(this.getState() == State.WAITING)
    			notifyAll();
    		else
    			start();
    	}
     
    	public synchronized void interromp(){
    			try {
    				wait();
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    	}
     
     
    	public void run() {
     
    		while(true)
    			try {
    				fp.getPanSys().repaint();
    				Thread.sleep(10);
    			} catch (InterruptedException e) { e.printStackTrace();}
     
    	}
     
    	private fenPrinc fp;
     
    }

  2. #2
    Membre averti Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Points : 323
    Points
    323
    Par défaut
    Fais voir le code des actionPerformed de l'ActionListener de ta barre d'outils.
    "Et tu comprendras pourquoi mon nom est l'Eternel, quand sur toi s'abattra la colère du Tout-puissant."

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 95
    Points : 66
    Points
    66
    Par défaut
    utilise la balise code

    indente ton code

    extendre thread..bof

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 95
    Points : 49
    Points
    49
    Par défaut code des actionPerformes
    Voilà le code des ActionPerformed et actionlistener.
    Je ne vois pas bien à quoi ça va avancer mais bon...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public void actionPerformed(ActionEvent e) {
     
    		if(e.getActionCommand().equals("Lancer"))
    			fp.getEv().anime();
     
    		else if(e.getActionCommand().equals("Arreter"))
    			fp.getEv().interromp();
    	}
    et la suite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //ajout des actions au menu déroulement
    		actionArreter = new ActionDeroulement("Arrêter", null, this);
    		actionArreter.putValue(AbstractAction.MNEMONIC_KEY, KeyEvent.VK_A);
    		actionArreter.putValue(AbstractAction.ACTION_COMMAND_KEY, "Arreter");
    		deroulement.add(actionArreter);
     
    		actionLancer = new ActionDeroulement("Lancer", null, this);
    		actionLancer.putValue(AbstractAction.MNEMONIC_KEY, KeyEvent.VK_L);
    		actionLancer.putValue(AbstractAction.ACTION_COMMAND_KEY, "Lancer");
    		deroulement.add(actionLancer);
    A mon avis, le problème n'est pas là. Ce serait plutôt dans le code du thread.
    Il semble que ce soit notifyAll() qui pose problème mais je n'en suis pas sûr.
    Merci pour votre attention.
    Gilles.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2005
    Messages : 163
    Points : 86
    Points
    86
    Par défaut
    Salut,
    si j'oublie ton interface graphique car je suis pas expert ds la matiére, le fait de faire un notifyAll te reveille tous les threads bloqués sur ton objet, si tu fais wait le thread va juste s'endormir mais il n'est surtout pas mort (tu ne la pas tué).
    donc il faut tuer ton thread : le mieu c'est de le faire sortir du while du run, il existe une méthode qui permet de tuer un thread mais si mes souvenir sont bons elle marche pas tres bien (à vérifier).
    voila j'espere que ça t'aider un peu
    bonne chance

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 159
    Points : 467
    Points
    467
    Par défaut
    Tu as les appels a wait et notifyAll dans des méthodes synchronized de la même classe, donc tant que le thread est en état d'attente, il aura toujours le cadenas de la classe et aucun autre Thread pourra exécuter l'autre méthode anime().
    En plus que je sache c'est pas génial d'utiliser wait et notifyAll sur ta même classe, essaye de créer une autre classe Animation par exemple que tu contrôleras grâce à la classe que tu as déjà.

  7. #7
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Ce que j'en dis c'est que tu fais du swing et que tu devrais plutôt te diriger vers un timer Swing et ses méthodes start/stop pour ce genre d'opérations...
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  8. #8
    Membre actif Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Points : 239
    Points
    239
    Par défaut
    Salut,

    Je te conseille deux choses:
    La première est te renseigner sur l'EDT, car il n'y a qu'un thread, l'EDT, qui traite les évènements(souris, clavier, affichage, ...). Ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    else if(e.getActionCommand().equals("Arreter"))
    			fp.getEv().interromp();
    va bloquer l'EDT. Donc ton IHM sera figé et tu ne pourras plus rien faire sur ton IHM.
    Deuxième chose si tu n'utilise pas la méthode préconisé par sinok, il faut que l'arrêt de ton animation(le fameux wait) soit dans le run du thread et non dans la méthode interromp.

    A+
    Hydraland

  9. #9
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 95
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par jamalmoundir
    Salut,
    si j'oublie ton interface graphique car je suis pas expert ds la matiére, le fait de faire un notifyAll te reveille tous les threads bloqués sur ton objet, si tu fais wait le thread va juste s'endormir mais il n'est surtout pas mort (tu ne la pas tué).
    donc il faut tuer ton thread : le mieu c'est de le faire sortir du while du run, il existe une méthode qui permet de tuer un thread mais si mes souvenir sont bons elle marche pas tres bien (à vérifier).
    voila j'espere que ça t'aider un peu
    bonne chance
    La seule manière d'arrêter efficacement un thread est qu'il est fini d'exécuter son code

Discussions similaires

  1. Petite question de débutant sur les lumières
    Par Clad3 dans le forum OpenGL
    Réponses: 12
    Dernier message: 05/11/2007, 22h22
  2. [C#] question de débutant sur les threads?
    Par Jayceblaster dans le forum C#
    Réponses: 6
    Dernier message: 27/11/2006, 10h52
  3. Réponses: 15
    Dernier message: 15/10/2006, 16h52
  4. question de débutant sur les jointures
    Par dreamcocktail dans le forum Langage SQL
    Réponses: 6
    Dernier message: 27/03/2006, 15h24
  5. question de débutant sur les objets
    Par boucher_emilie dans le forum ASP
    Réponses: 3
    Dernier message: 06/08/2004, 10h51

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