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 :

Communication entre GUI et thread


Sujet :

Concurrence et multi-thread Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Communication entre GUI et thread
    Bonjour,
    j'utilise NetBeans 7.0.
    Je voudrais réaliser le programme suivant:
    J'ai un panneau (JPanel) contenant une zone de texte (JTextField) et un bouton.
    Lorsque je clique sur le bouton, je veux démarrer un thread. Ce thread réalise en boucle une tâche plus ou moins longue, et à chaque boucle je veux afficher le résultat de la tâche dans la zone de texte.
    Je crois que la meilleure façon de faire est d'implémenter un écouteur (la classe de mon GUI écoute le thread). Mais je ne sais pas comment faire.
    Dois-je créer une interface écouteur de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import java.util.EventListener;        
    public interface eventListener extends EventListener
    {
      void addEventListener(MyThread thread);
    }
    Je ne suis sûrement pas le premier à vouloir faire ça...
    Pouvez-vous m'orienter vers la solution ?
    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Le plus simple est de passer en paramètre à votre Thread lors de sa création le composant sur lequel il doit écrire ses résultat

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    949
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 949
    Points : 1 857
    Points
    1 857
    Par défaut
    Je modifierai la boucle principale d'exécution du programme pour qu'elle vérifie l'état des threads secondaires quand elle a fini de traiter les événements utilisateurs, mais c'est difficile de vous aider sans savoir quelle API vous utilisez car cette boucle dépend justement de l'API.
    Dans Swing, elle est cachée mais on peut utiliser SwingUtilities.invokeLater pour faire ce que vous demandez.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    949
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 949
    Points : 1 857
    Points
    1 857
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Le plus simple est de passer en paramètre à votre Thread lors de sa création le composant sur lequel il doit écrire ses résultat
    Swing n'aime pas du tout qu'on accède à ses composants depuis plusieurs threads.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Le plus simple est de passer en paramètre à votre Thread lors de sa création le composant sur lequel il doit écrire ses résultat
    Merci pour votre réponse. C'est en fait ma première solution (qui fonctionne). Je passe au thread la référence de la zone de texte. Mais je ne trouve pas cette approche très P.O.O. Je débute en Java, mais je connais le C++. En C++, le thread enverrait un message au GUI pour lui demander de mettre à jour ses champs, plutôt que de le faire faire directement par le thread.
    Cordialement

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par BugFactory Voir le message
    Je modifierai la boucle principale d'exécution du programme pour qu'elle vérifie l'état des threads secondaires quand elle a fini de traiter les événements utilisateurs, mais c'est difficile de vous aider sans savoir quelle API vous utilisez car cette boucle dépend justement de l'API.
    Dans Swing, elle est cachée mais on peut utiliser SwingUtilities.invokeLater pour faire ce que vous demandez.
    Merci pour votre réponse. J'utilise Swing. Mais les "listeners" ne sont-ils pas faits pour ce genre de problème ?

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Citation Envoyé par Harry_Covair Voir le message
    Merci pour votre réponse. C'est en fait ma première solution (qui fonctionne). Je passe au thread la référence de la zone de texte. Mais je ne trouve pas cette approche très P.O.O. Je débute en Java, mais je connais le C++. En C++, le thread enverrait un message au GUI pour lui demander de mettre à jour ses champs, plutôt que de le faire faire directement par le thread.
    Cordialement
    Les message GUI, c'est pas à toi de t'en occuper, les composant s'en chargent. Quand au message de bugfactory: je n'ai jamais dit qu'il fallait faire la modification depuis le thread (unité ordonnancement) en question, juste qu'il
    fallait passer le composant au Thread (classe) pour qu'il puisse transférer l'information au composant.

    Clairement, je commencerais comme ça:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public Thread MyThread extends Thread{
       private JTextComponent destination;
       //.....
       // hop une mise à jour à faire:
       SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                destination.setText(newText);
            }
       };
    }
    propre, simple pour commencer.

Discussions similaires

  1. communication entre un std::thread et le main
    Par robinsondesbois dans le forum Threads & Processus
    Réponses: 5
    Dernier message: 17/04/2014, 16h44
  2. Réponses: 5
    Dernier message: 01/08/2012, 20h13
  3. [c#][threading] communication entre threads
    Par orelero dans le forum C#
    Réponses: 6
    Dernier message: 02/01/2006, 00h42
  4. Communication entre 2 threads
    Par marsupilami34 dans le forum Langage
    Réponses: 4
    Dernier message: 26/08/2005, 15h08
  5. Communication entre deux Threads
    Par rvzip64 dans le forum Langage
    Réponses: 13
    Dernier message: 28/01/2005, 09h14

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