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

avec Java Discussion :

problème de barre de progression


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 41
    Points : 16
    Points
    16
    Par défaut problème de barre de progression
    Salut tout le monde,

    Depuis une semaine, je galère dans un problème de barre de progression, je vous explique :

    Je veux exécuter une commande ainsi :

    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
    String[] command = new String[] {"C:\\mzWiff\\Debug\\mzWiff.exe", "--mzXML", "-v", "C:\\Directory\\" + wiffFile.getName()};
     
    try {
     
       // executes the command
     
       Process pr = Runtime.getRuntime().exec(command);
     
       progressDialog = new ProgressDialog(frame,"Progress");
     
       progressDialog.displayTimeLeft = false;
     
       progressDialog.showAnimation = true;
     
       progressDialog.displayPercentageInProgressBar = true;
     
       progressDialog.beginTask("converting to mzXML", 100, true);
     
       // waits for the end of the process 
     
       System.out.print("Waiting...");
     
       // progressDialog = new ProgressDialog(frame,"Progress");
     
       new PrintStream(pr.getInputStream(),progressDialog).run();
     
       pr.waitFor();
     
       System.out.println("Done!");
       ...
    Et voilà un bout du printStream() :

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    public class PrintStream extends Thread{
     
     
     
    /**
     
          * Methods that will retrieve the progress of MZWIFF 
     
          **/
     
            public PrintStream(InputStream is, ProgressDialog p) {
     
                __is = is;
     
                progressDialog = p;
     
           } 
     
     
     
     
             public void run() {
     
                   ...
     
                   // for example, n = 100, d = 5500, so x = 1 per cent.
     
                   x = n*100/d;
     
                progress(x,100,getOldPercentage());
     
                ...
     
     
     
              public void progress(int percentage, int range, int oldPercentage) throws InterruptedException { 
     
                   if(progressDialog.isCanceled()) {
     
                      System.out.println("CANCELED.");
     
                      progressDialog.finished
     
                }
     
                System.out.println(percentage + " of " + range + "\n");
     
                progressDialog.worked(percentage - oldPercentage);
     
                Thread.sleep(500); 
     
            }
     
    }
    et le programme fonctionne bien, le fichier de sortie est créé, voilà même ce qu'affiche ma cconsole java :

    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
    Waiting...
     
    1 of 100 
     
    3 of 100
     
    4 of 100
     
    ...
     
    69 of 100
     
    Done!
     
    70 of 100
     
    ...
     
    97 of 100
     
     
    99 of 100
    Petit hic, la progress bar ne s'affiche que lorsque le processus est terminé (lorsque done! s'affiche)...

    Quelqu'un aurait il une solution?

  2. #2
    Membre émérite
    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
    Points : 2 582
    Points
    2 582
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 41
    Points : 16
    Points
    16
    Par défaut
    Bon, 2 semaines que je suis bloquée sur ce probléme de progression!! Dans tous les exemples que j'ai trouvé, rien ne ressemblait à ce que je veux faire, c'est à dire, exécuter un processus par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Runtime.getRunim().exec(cmd)
    et afficher une barre de progression à cette exécution!

    j'arrive pourtant à récupérer les pourcentages montrant la progession par , pourtant la progress bar ne s'affiche qu'après l'exéction!! c'est vraiment bizarre...

    Serait-ce possible que ça soit le lancement d'un processus qui bloque l'affichage de la barre??

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu bloque ton Thread swing avec ton pr.waitFor(). D'ailleurs, tu remarquera, que si tu fait glisser une fenetre au dessus de tes fenetres swing, elles ne se redessinent pas tant que pr.waitFor() n'est pas revenu.

  5. #5
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Plus de détail ici.

    -"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
    -"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".

    Pieds d'argile (1996), Terry Pratchett 1948 - 2015
    (trad. Patrick Couton)

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 41
    Points : 16
    Points
    16
    Par défaut
    Ben j'ai essayé en enlevant le waitFor(), mais toujours pas de barre de progression, et en + le programme bloque à la fin de la progression dans la console (ça ne sort pas de printStream!!).

    J'ai remplacé le .run() par .start() dans le programme principal mais il fait tout et rentre dans mon PrintStream à la fin, donc il ne fait rien....

    Donc que dois je faire???

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 41
    Points : 16
    Points
    16
    Par défaut
    Bon ben j'ai vraiment tout essayé du site que vous m'avez donné mais c'est toujours pareil............... Quelqu'un peut m'aider svp???????

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    La première choe à faire, c'est de t'assurer que tu sort bien de ton actionListener, ou autre chose qui a déclenché l'exécution du process, le plus tôt possible (met un system.out.println à la fin). Deuxièmement, assure toi que t'as bien affiché la frame dans laquelle se trouve ta progress bar (on a pas le code ici, donc impossible de saoivr ce qui se passe exactement). La pluspart du temps, quand un composant ne se dessinne pas pendant un moment, c'est parce que ton code monopolise, dans une de ses action, et pendant plusieurs secondes, le Thread associé à swing. Mais çà peut être aussi parce que tu n'ajoute ta progress bar dans la fenêtre qu'à la fin ou parce que tu fais le show après que ton programme aie fini. Encore une fois, sans avoir tes méthodes, impossible de savoir.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 41
    Points : 16
    Points
    16
    Par défaut
    En fait, ma barre de progression, ce n'est pas moi ki l'ait créée! C'est une classe java aui a été créée il n y a pas très longtemps, ça s'appelle ProgressDialog, il y a son api sur java sun, mais j'avoue qu'il n'y a pas vraiment de détail.
    Sinon, il y a un site sur le quel tu as des infos dessus, et ou tu peux télécharger cette bar : http://jack.asprise.net/software/pro...itordialog.php

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    la classe progressdialog n'a que peu d'importance. L'important c'est que tu dois sortir de ton acitonListener ou autre pour que la boite de dialog devienne visible. Comme mentionné dans les liens qui t'ont été donné. Tant que tu monopolise le thread awt, celui-ci n'effectuera aucune des fonciton d'affichage qui ont été demandée. Pour reprendre ton premier code, tant que tu n'est pas passé sur "System.out.println("done...");" rien ne changera à l'écran (et pour cause, ton code à toi monopolise le thread awt en attendant que le processs se termine. Pour plus de détails, voir ici

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 41
    Points : 16
    Points
    16
    Par défaut
    Comment pourrais je faire car je n'ai pas d'idée!!
    Au début j'ai une frame puis quand je clik sur un bouton, on declenche un premier actionListener et on affiche une frame interne sur lakelle on choisit 2 fichiers dont le code C++ a besoin. Quand c'est choisi, on clik sur un bouton de la frame interne et on est dans un second actionListener. C'est là ou j'execute mon process...

    Apres ce ke tu m'as dit j'ai déplacé cette partie ki declenche le process, dans une nouvelle méthode ke j'appelle à la fin! Mais en fait cette méthode s'exécute en premier, avant de créer mes frame, donc ça me fait une erreur......

    Comment faire??

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu dois soit déplacer le suivi de the process externe dans un Thread à part (c'est le Thread swing qui exécute l'actionlistener, faut donc aller le plus vite possible pour libérer la main le plus vite possible là dedans), soit tu ne fait pas la waitFor sur le process.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 41
    Points : 16
    Points
    16
    Par défaut
    Bon, en fait, si j'enleve le waitFor() mais ça ne marche pas car tout le code s'exécute avant même d'attendre que le processus ne s'exécute.
    Pour la deuxiéme solution proposée, est ce que tu pourrais me dire comment je devrais faire pour faire mon process en dehors du actionListener, car c en cliquant sur le bouton que le processus doit être déclaré!!

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu fait ton "long traitement" dans un Thread à part, comme l'indique la FAQ qu'on t'as montrée bien en avant sur cette discussion.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 41
    Points : 16
    Points
    16
    Par défaut
    pourrais tu stp me donner l'exemple sur mon cas sachant ke g ça :

    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
     
    final JButton convertWiff = new JButton();
    convertWiff.addActionListener(new ActionListener() {
    	public void actionPerformed(ActionEvent e) {
                  ...
    		JButton convertButton = new JButton();
    		convertButton.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
                              	             ...
                                                       copyFiles(aWiffFilePath,"C:\\Directory");
    		             	copyFiles(aScanFilePath,"C:\\Directory");						                                       new beginProcess().start();
                                          }
                             });
                 }
    });
    voici beginProcess :

    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
        class beginProcess extends Thread{
     
    	    public void run(){
                              SwingUtilities.invokeLater(new Runnable(){
    			public void run(){
    			            ...
                                                       try {
    		    			final Process pr = Runtime.getRuntime().exec(command);
    		    			new PrintStream(pr.getInputStream(),internalFrame).start();	    			
    		    			pr.waitFor();
                                                       } catch (Throwable t){
    		    			System.out.println("Caught " + t);
    		    		}
     
        			}
    	               });
    	    }
    }
    le PrintStream va juste calculer la progression et envoyer ce pourcentage à la barre...

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	    public void run(){
                              SwingUtilities.invokeLater(new Runnable(){
    			public void run(){
    			            ...
                                                       try {
     
    		    			pr.waitFor();
    Tu te rend compte de ce que tu fais là? Tu crée un Thread (beginProcess) qui lui même balance le gros morceaux (avec le waitFor() ) sur la pile du Thread AWT, tu annule le bénéfice de ton Thread séparé en rebloquant via invokeLater, la pile d'appel AWT.

Discussions similaires

  1. [AC-2003] Problème avec barre de progression
    Par cluster26 dans le forum VBA Access
    Réponses: 4
    Dernier message: 22/07/2010, 09h06
  2. Barre de progression : problème affichage
    Par link256 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 21/07/2009, 12h23
  3. [D2007] Problème de barre de progression sous Vista
    Par msprittc dans le forum Composants VCL
    Réponses: 2
    Dernier message: 13/12/2007, 13h31
  4. Problème avec une Barre de Progression
    Par hugo69 dans le forum Access
    Réponses: 1
    Dernier message: 15/12/2006, 15h37
  5. Réponses: 12
    Dernier message: 27/05/2004, 00h13

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