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

Java Discussion :

[Thread]Savoir si un thread s'est bien terminé.


Sujet :

Java

  1. #1
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut [Thread]Savoir si un thread s'est bien terminé.
    Bonjour à tous,

    Je voudrais avoir des conseils pour le problème suivant.

    J'ai crée une interface graphique, qui quand on appui sur un bouton valider lance un traitement assez long (ganération d'un fichier PDF). Or pour que l'interface ne se gêle pas, j'ai mis la génération de ce fichier dans un Thread lancé depuis l'interface graphique.

    Or il peut arriver que la génération de se fichier se passe mal (le fichier xml ou xsl-fo n'est pas trouvé par exemple). Donc je voudrais afficher le status de la génération dans un JTextField de mon interface. Or le problème est que je dois savoir si le Thread lancé par mon interface s'est terminé correctement.

    Alors comme dois-je procéder ?

    Merci pour vos conseils.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 77
    Points : 77
    Points
    77
    Par défaut
    Le plus propre je crois est d'utiliser un listener.

    En gros, ton interface écoute le traitement du Thread qui l'informe de son execution.

  3. #3
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Mais existe t-il déjà des listeners de Thread ?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 77
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par thibaut
    Mais existe t-il déjà des listeners de Thread ?
    Tu fais ton propre Listener :

    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
     
    public class MonPanneau implements MyConversionListener {
     
       // ....
     
      private void lancerConversion() {
         ConversionHandler h = new ConversionHandler(this);
         new Thread ... {
            h.lanceConversion();
         }
      }
     
      public void maConversionEstFinie() {
         monTextField.setText("Conversion terminée");
      }
     
    }
    Et ton ConversionHandler prends en paramètre un MyConversionListener qu'il informe lorsque la conversion est terminée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public interface MyConversionListener {
       public void maConversionEstFinie(); 
    }
    C'est plus clair ?

  5. #5
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    C'est bon j'ai trouvé, la solution, il suffit de passer la référénce à mon JTextField dans mon Thread...

    Merci à tous

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 77
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par thibaut
    C'est bon j'ai trouvé, la solution, il suffit de passer la référénce à mon JTextField dans mon Thread...

    Merci à tous
    C'est pas très propre comme solution, avec un listener tu peux utiliser ta conversion à plusieurs endroits, là ce n'est pas le cas.

    N'oublies pas de marquer résolu ce thread.

  7. #7
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Oui mais un listener m'oblige de créer un autre Thread pour écouter et mettre à jour le JTextField.

    Oui chef je met résolu dès que quelqu'un peut éventuellement me donner un meilleure solution ...

    PS: J'ai un peu été modérateur avant...

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 77
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par thibaut
    Oui mais un listener m'oblige de créer un autre Thread pour écouter et mettre à jour le JTextField.

    Oui chef je met résolu dès que quelqu'un peut éventuellement me donner un meilleure solution ...

    PS: J'ai un peu été modérateur avant...
    Et avec mes 33 messages, je pese pas lourd

    C'est marrant je suis aussi à Chatillon.

    Pour le listener, je ne vois pas pourquoi ca t'oblige à créer un Thread, que tu passes ton JTextField ou une Interface, ca revient au meme, l'interface est plus générique et peut servir dans d'autres cas.

  9. #9
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Tu pourrais utiliser la classe SwingWorker pour cela :
    Tu trouveras plein d'info sur cette classe dans le forum GUI et/ou AWT/Swing

    a++

  10. #10
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Citation Envoyé par otsgd
    [..]C'est marrant je suis aussi à Chatillon.
    Cool

  11. #11
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par thibaut
    Oui mais un listener m'oblige de créer un autre Thread pour écouter et mettre à jour le JTextField.
    Euh, non pas vraiment...

    Pourquoi faire cela?

    Il suffit de mettre à jour par SwingUtilities.invokeLater(...) (tu es obligé de faire cela à partir de ton Thread pour respecter la règle du Thread unique d'interface graphique, ou alors tu utilises SwingWorker comme l'a dit adiGuba...)

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 194
    Points : 234
    Points
    234
    Par défaut
    Citation Envoyé par thibaut
    Cool
    Citation Envoyé par ®om
    Euh, non pas vraiment...

  13. #13
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Merci pour vos réponses en tout cas.

    J'ai utilisé le SwingWorker de adiGuba (le super-boss). Par contre le SwingWorker bloque mon bouton, est-ce normal ?

    Merci

  14. #14
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par thibaut
    adiGuba (le super-boss).
    N'exagéront rien !


    Citation Envoyé par thibaut
    Par contre le SwingWorker bloque mon bouton, est-ce normal ?
    Comment tu l'utilises ? on pourrait voir ton code ?

    a++

  15. #15
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Le voici:

    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
            bGenerer.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {            
                    final SwingWorker worker = new SwingWorker() {
     
                        protected Object doInBackground() throws Exception {
                            PdfGenerator generator = new PdfGenerator(); 
                            String result = "Ok";
                            try {
                                generator.run(xslFile.getText(), xmlFile.getText(), output.getText());
                            } catch (Exception e) {
                                result = e.getMessage();
                            }
     
                            return result;
                        }
                    };
     
                    worker.run();
     
                    try {
                        message.setText((String) worker.get());
                    }
                    catch (Exception e1) {
                        message.setText(e1.getMessage());
                    }
                }
            });
    Et j'explicite un peu:

    xslFile, xmlFile, output sont des JTextField qui réprésentent un fichier xsl, xml et un fichier de sortie (pdf).


    PdfGenerator s'occupe de transformer le XSL en PDF avec FOP.

    message est un JTextfield qui affiche ok ou l'erreur rencontrée.

    Voilà

  16. #16
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Justement tu l'utilises mal

    Tout comme les threads tu ne dois pas appeller la méthode run() directement, sinon le traitement long s'exécutera dans le thread courant !!!

    A la place il faut soit appeller la méthode execute() qui place la tâche dans une queue d'exécution (10 tâches à la fois max il me semble), soit passer directement le SwingWorker à un ExecutorService qui se chargera de l'exécuter selon d'autres critères...

    De plus tu peux utiliser les Generics pour modifier le type de retour de get() et doInBackground(). Enfin le code a effecter dans l'EDT à la fin du traitement doit être dans la méthode done() du SwingWorker, ce qui donnerait dans ton cas (en bleu les principales différences) :
    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
            bGenerer.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    new SwingWorker<String,Object>() {
    
                        protected String doInBackground() throws Exception {
                            PdfGenerator generator = new PdfGenerator();
                            String result = "Ok";
                            try {
                                generator.run(xslFile.getText(), xmlFile.getText(),
                                        output.getText());
                            } catch (Exception e) {
                                result = e.getMessage();
                            }
    
                            return result;
                        }
                        
                        @Override
                        protected void done() {
                            try {
                                message.setText(get());
                            } catch (Exception e1) {
                                message.setText(e1.getMessage());
                            }
                        }
                    }.execute();
                }
            });
    a++

  17. #17
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Merci pour te lumières monsieur le boss.

    Ca marche miquel.

    A+

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

Discussions similaires

  1. Comment savoir si une requete c'est bien passé
    Par choubak dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 04/07/2007, 15h26
  2. Réponses: 6
    Dernier message: 12/09/2006, 11h08
  3. [Threads] Savoir si un thread a provoqué une erreur
    Par anykeyh dans le forum Windows
    Réponses: 6
    Dernier message: 26/04/2006, 15h12
  4. [JDBC] Savoir si un INSERT s'est bien effectué
    Par david71 dans le forum JDBC
    Réponses: 5
    Dernier message: 16/02/2005, 12h06
  5. Comment savoir si une impression s'est bien déroulé?
    Par Cyrilh7 dans le forum C++Builder
    Réponses: 5
    Dernier message: 19/11/2003, 20h49

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