[JAVA] Problème de process

Résolu/Fermé
freto Messages postés 1543 Date d'inscription vendredi 6 juillet 2007 Statut Membre Dernière intervention 8 avril 2016 - 21 mars 2008 à 16:39
freto Messages postés 1543 Date d'inscription vendredi 6 juillet 2007 Statut Membre Dernière intervention 8 avril 2016 - 2 mai 2008 à 14:30
Bonjour tout le monde.
Je sollicite votre haute bienveillance pour m'aider sur un problème technique qui m'empêche d'avancer.
En gros, j'ai besoin de votre aide. Voici le contexte:
J'ai développé un GUI, qui utilise une classe nommée Traitement (code ci après) en java. Cette classe exécute un script me permettant de récupérer des sources sur un serveur CVS. Je sais qu'il existe des librairies CVS pour java, mais je n'ai pas envie de les tâter. Lors d'un clic sur un bouton de mon interface, je lance la méthode, en lui pasasnt en paramètre ce qu'il lui faut. L'exécution se lance, mais se bloque au bout d'un tout petit moment, et je ne recupère pas toutes les sources (a peine 10 fichiers, sur 100 a peu près). Voici le code de la classe exécutant le script:
import java.io.*;
import javax.swing.*;
public class Traitements extends Thread {
    
    private String projPath;
    
    public static Process proc;
    
    
    /** Constructeur par défaut de la classe Traitements */
    public Traitements(String projPath) {   
        super();
        this.projPath=projPath;
    }
    
    /*
     *Méthode récupérant les sources d'un projet à partir de cvs
     *Stocke le projet dans un répertoire temporaire C:\ProjTemp
     *@param projPath le nom complet du projet
     */
    public void run(){
        //exécuter le script recupProj projPath
        
        String[] comm=new String[2];
        comm[0]="D:\\DATA\\Essais\\recupProj.bat";
        comm[1]=projPath;
        
        try{
            proc=Runtime.getRuntime().exec(comm);
            
            
            BufferedReader in=new BufferedReader(new InputStreamReader(proc.getInputStream()));
            String line="";
            while((line=in.readLine())!=null){
                
                System.out.println(line);
                               
            }
            
        }catch (Exception e){
            System.out.println("On est en exception de traitement");
            System.out.println( e.getMessage());
            
        }
    }
    
}


et voici la méthode d'action du bouton:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        if(projectChoice==null){
            this.jTextPane1.setText("Veuillez sélectionner un projet");
        }else{
            String projPath="1_titulaire/"+projectChoice.substring(8);  //on concatene 1_titulaire/ au nom de projet choisi
            Traitements t=new Traitements(projPath);
            t.start();

        }
    }
A voir également:

3 réponses

freto Messages postés 1543 Date d'inscription vendredi 6 juillet 2007 Statut Membre Dernière intervention 8 avril 2016 162
25 mars 2008 à 10:51
Encore une fois, la solution m'est venue toute seule, seulement je ne sais pas pourquoi sa fonctionne.
J'ai juste récupéré les flux du process dans un Thread, et maintenant la récupération se fait completement. Le seul soucis, c'est que mon thread stoque la sortie dans une chaine de caractère, mais cette sortie n'est pas complete. Lorsque je l'affiche, j'ai que les n premiers fichiers récupérés, n étant inférieur au nombre de fichiers totals.
Je planche la dessus pour avoir la sortie standard complète.
0
freto Messages postés 1543 Date d'inscription vendredi 6 juillet 2007 Statut Membre Dernière intervention 8 avril 2016 162
2 mai 2008 à 10:41
Jme permet de faire un ti up de ce post, car un nouveau problème apparait: maintenant il me récupère bien un projet total (plus de 1000 fichiers, c'est un peu long mais sa passe), tandis qu'il ne peut jamais récupérer un fichier seul: en gros, dans mon Thread de lecture, lorsqu'il doit récupérer 1000 fichiers, le BufferedReader me ressort à peu près immédiatement une ligne pour alimenter un controle ProgressMonitor, mais quand il ne doit récupérer qu'un seul fichier (voire même une dizaine), le flux n'est jamais prêt à être lu, et du coup il bloque.
Voici le code de lecture, placé dans un SwingWorker:
  compteFichiers = new TraitementCVS(Constantes.COMPTAGE_FICHIERS);
            compteFichiers.setProjPath(modCourant);
            compteFichiers.setRevision(version);
            compteFichiers.start();
            BufferedReader inComptage;
            String lineCmpt;
            nbFichiers = 2000;
            try {
                compteFichiers.join();
            } catch (Exception eCompt) {
                System.out.println("Erreur lors du comptage des fichiers dans le module");
                eCompt.printStackTrace();
            } finally {
                try {
                    inComptage = compteFichiers.getResult();
                    while ((lineCmpt = inComptage.readLine()) != null) {
                        nbFichiers = Integer.parseInt(lineCmpt);
                    }
                    moniteur.setMaximum(nbFichiers);
                } catch (Exception eLecture) {
                    System.out.println("Erreur lors de la lecture du nombre de fichiers");
                    eLecture.printStackTrace();

                }
            }

            //On peut maintenant lancer le traitement CVS avec le module courant
            recupModule = new TraitementCVS(Constantes.RECUPERER_PROJET);
            recupModule.setProjPath(modCourant);
            recupModule.setRevision2(this.version);

            recupModule.start();
            //NE RESTE PLUS QU'A RECUPERER LE RESULTAT DU TRAITEMENT!!!
            try {
                Thread.sleep(2000);

            } catch (Exception eAttenteRecup) {
                eAttenteRecup.printStackTrace();
            } finally {
                BufferedReader inRecup = recupModule.getResult();
                String line;
                try {
                    progress = 0;
                    line = inRecup.readLine();
                    while (line != null) {
                        //chaque ligne correspond à un fichier récupéré
                        progress++;
                        moniteur.setProgress(progress);
                        System.out.println(line);
                        moniteur.setNote(line);
                        if (moniteur.isCanceled()) {
                            moniteur.close();
                            recupModule.interrupt();
                            parent.setEnabled(true);
                            break;
                        }
                        while (!inRecup.ready()){
                            Thread.sleep(10);
                            System.out.println("On attend que le flux soit pret");
                        }
                        line=inRecup.readLine();
                        System.out.println("Ligne Lue");
                    }
                    System.out.println("On a fini de lire les lignes");
                } catch (Exception lecture) {
                    System.out.println("Exception lecture recup");
                    lecture.printStackTrace();

                }
            }

        }
        moniteur.close();

A savoir que la classe TraitementCVS hérite d'une classe Traitement, elle même héritante de Thread. Donc au total on a un thread qui exécute la commande CVS et me renvoie un BufferedReader, un SwingWorker qui lit dans ce BufferedReader et qui est censé placer chaque ligne dans un ProgressMonitor (qui au passage ne peut pas s'afficher, vu que le flux n'est pas lu).
Chose importante aussi: l'exécution arrive jusqu'à System.out.println("On attend que le flux soit pret"); et tourne en boucle: cela veut dire qu'il arrive à lire une ligne quand même, mais il ne m'affiche pas le ProgressMonitor.
En espérant que quelqu'un pourra m'aider...et que j'aurai été assez complet.
Merci d'avance...
0
freto Messages postés 1543 Date d'inscription vendredi 6 juillet 2007 Statut Membre Dernière intervention 8 avril 2016 162
2 mai 2008 à 14:30
Bon encore une fois je retrouve la réponse tout seul...aide toi et le ciel t'aidera comme on dit.
La solution?? fallait faire un System.gc() avant de commencer à récupérer les fichiers (ben ouaip, c'est qu'il y en avait des miettes d'objet encombrantes à ramasser).
Merci quand même...
0