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 :

ProcessBuilder : ça freeze !


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Par défaut ProcessBuilder : ça freeze !
    Bonjour à tous,

    Je suis en train d'écrire une petite application en Java qui me permet de programmer mes cartes électroniques via un programmateur PicKit 2, directement sous Mac OSX ou Linux.

    Le programme fonctionne et voici à quoi il ressemble :



    Mon programme utilise donc un exécutable externe, pk2cmd, et je lui envoie donc les paramètres adéquats quand j'appuie sur chacun des boutons (à ce niveau là, ça marche nickel).
    Mon souci :
    J'aimerais faire en sorte que ma barre d'animation bouge pendant que j'appuie sur un des boutons et m'affiche le résultat en temps réel dans la JTextArea.
    Actuellement, quand je lance une opération, le programme semble se 'freezer' pendant l'opération et n'affiche le résultat qu'une fois que le pk2cmd a fini son travail.

    J'ai essayé de nombreuses méthodes, en passant par les Runtime.exec et les ProcessBuilder, mais rien n'y fait
    Je sais que c'est un tout petit détail, mais ne pas comprendre pourquoi ça ne marche pas et ne pas savoir résoudre ce petit problème me donne mal au crâne

    Je n'utilise que des composants swing standards.

    Voici ma méthode qui est appelée quand j'appuie sur un des boutons, via un ActionListener :

    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
        public void ExecuterCommande(String[] commande) {
            //On met la barre de chargement en mouvement
            progressBar.setIndeterminate(true);
            Process p = null;
            try {
                //Exemple de commande : 
                // {"/bin/bash", "-c", "pk2cmd -P -R -T"};
                ProcessBuilder pb = new ProcessBuilder(commande);
                pb.redirectErrorStream(true);
                p = pb.start();
                InputStreamReader isr = new InputStreamReader(p.getInputStream());
                BufferedReader br = new BufferedReader(isr);
     
                String lineRead;
                while ((lineRead = br.readLine()) != null) {
                    // J'affice dans une JTextArea le résultat de la commande
                    logArea.append(lineRead + "\n");
                    logArea.setCaretPosition(logArea.getDocument().getLength());
                }
                p.waitFor();
                p.getInputStream().close();
                p.getOutputStream().close();
                p.getErrorStream().close();
                p.destroy();
            } catch (InterruptedException | IOException ex) {
                Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex);
            }
            // On arrête de faire bouger la barre de progression
            progressBar.setIndeterminate(false);
        }
    Une idée ?

  2. #2
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Par défaut
    J'ai entendu parler des SwingWorker, mais j'ai du mal à bien comprendre leur fonctionnement et surtout, comment adapter les exemples à mon programme

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Par défaut
    Bon, c'est quasi résolu !
    La solution était bien les SwingWorkers.
    Ca fonctionne mais vu qu'il s'agit d'une classe abstraite, je n'arrive pas à changer la méthode doInBackground pour qu'elle reçoive en paramètre d'entrée le tableau de String[] commande.
    Du coup, je suis obligé de copier cette classe autant de fois qu'il y a de boutons dans mon programme (en changeant manuellement la variable commande)
    Ca marche mais c'est pas très propre, je suis toujours ouvert à une suggestion d'amélioration pour qu'au final je n'utilise qu'une seule fois cette classe avec un paramètre d'entrée différent

    Voici ce que j'ai fait :

    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
    public class CheckPicInstalled extends SwingWorker<Integer, Integer> {
     
            @Override
     
            protected Integer doInBackground() throws Exception {
                MainWindow.cont.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
                String[] commande = {"/bin/bash", "-c", "pk2cmd -P"};
                ProcessBuilder pb = new ProcessBuilder(commande);
                pb.redirectErrorStream(true);
                MainWindow.progressBar.setIndeterminate(true);
                Process p = pb.start();
                //Le code suivant permet d'afficher le résultat en temps réel dans la JTextArea
                InputStreamReader isr = new InputStreamReader(p.getInputStream());
                BufferedReader br = new BufferedReader(isr);
                String lineRead;
                while ((lineRead = br.readLine()) != null) {
                    // J'affice dans une JTextArea le résultat de la commande
                    MainWindow.logArea.append(lineRead + "\n");
                    MainWindow.logArea.setCaretPosition(MainWindow.logArea.getDocument().getLength());
                }
                MainWindow.progressBar.setIndeterminate(false);
                MainWindow.cont.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
                return null;
            }
        }

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Par défaut
    Définitivement résolu !
    J'ai passé mon tableau de String commande en static.
    J'avais déjà pensé à ça, mais mon erreur était que j'initialisais mal mon tableau.
    Voici ce que j'ai dans mes écouteurs d'événements :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (event.getSource() == boutonCheckPicInstalled) {
                    //Tableau ! Il faut initialiser par index
                    commande[0] = &quot;/bin/bash&quot;;
                    commande[1] = &quot;-c&quot;;
                    commande[2] = &quot;pk2cmd -P&quot;;
                    MainWindow.progressBar.setValue(0);
                    logArea.append(&quot;Searching for your PIC on board ...\n&quot;);
                    //La classe Operations ira chercher la variable commande qui est en static !
                    new Operations().execute();
                }

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

Discussions similaires

  1. Probleme de freeze au chargement d'une vidéo
    Par Kill@m@n dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 05/07/2005, 19h15
  2. mon pc freeze
    Par rvdesiles dans le forum Ordinateurs
    Réponses: 26
    Dernier message: 30/04/2005, 12h14
  3. [tomcat] freeze ...
    Par Valerio dans le forum Tomcat et TomEE
    Réponses: 24
    Dernier message: 12/04/2005, 14h39
  4. [TOMCAT] Tomcat "freeze"...
    Par psylo dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 23/06/2004, 13h33
  5. Réponses: 4
    Dernier message: 04/12/2002, 11h07

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