[JAVA] Problème de process
Résolu
freto
Messages postés
1543
Date d'inscription
Statut
Membre
Dernière intervention
-
freto Messages postés 1543 Date d'inscription Statut Membre Dernière intervention -
freto Messages postés 1543 Date d'inscription Statut Membre Dernière intervention -
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:
et voici la méthode d'action du bouton:
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:
- [JAVA] Problème de process
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel - Télécharger - Jeux vidéo
- Process hacker - Télécharger - Divers Utilitaires
- Process explorer - Télécharger - Informations & Diagnostic
- Eclipse java - Télécharger - Langages
3 réponses
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.
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.
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:
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...
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...