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

Entrée/Sortie Java Discussion :

Process qui ne se lance pas


Sujet :

Entrée/Sortie Java

  1. #1
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut Process qui ne se lance pas
    Bonjour à tous

    J'ai une interface qui permet de faire des calculs de profils via un executable écrit en C. L'utilisateur à plusieurs possibilité de paramétrage pour faire le calcul mais au final les paramètres sont enregistrés dans un fichier temporaire qui est passé en paramètre à l'executable C. Une fois ce fichier rempli, je lance cet exécutable en utilisant un Process. L'exécution se fait dans la routine ci dessous


    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
     
    String[] args = { Parametrage.getInstance().getExecutable(), "-c",Parametrage.getInstance().getCheminResultatsIntermediaires() + "/profil.temp",Parametrage.getInstance().getCheminResultatsIntermediaires() + "/my.cfg" };
    			ProcessBuilder pb = new ProcessBuilder(args);
    			Process p = pb.start();
    			InputStream is = p.getInputStream();
    			InputStreamReader isr = new InputStreamReader(is);
    			InputStream errSt=p.getErrorStream();
    			InputStreamReader isErr = new InputStreamReader(errSt);
    			BufferedReader br = new BufferedReader(isr);
    			BufferedReader brErr = new BufferedReader(isErr);
    			String ligne;
    			System.out.println("--------------Debut calcul profil--------------");
    			ligne=br.readLine();
    			while (ligne != null) {
    				System.out.println(ligne);
    				ligne=br.readLine();
    			}
    			p.waitFor();
    			ligne=br.readLine();
    			while (ligne != null) {
    				System.out.println(ligne);
    				ligne=br.readLine();
    			}
    			System.out.println("--------------Fin calcul profil----------------");
    			ligne=brErr.readLine();
    			while (ligne != null) {
    				System.out.println("ERREUR ("+ligne+")");
    				ligne=br.readLine();
    			}
    			int res = p.exitValue();
    			System.out.println(res);
    			if (res == 0)
    				afficherDernierProfil();
    			else {
    				JOptionPane.showMessageDialog(ModuleProfilFrame.this, Localisation.getText("ModuleProfil.ErreurCalcul"),
    						Localisation.getText("ModuleProfil.Erreur"), JOptionPane.ERROR_MESSAGE);
    			}
    Malheureusement j'ai un cas ou il semble que l’exécutable ne se lance pas.

    Y a t'il un moyen de savoir si la commande pb.start() a fonctionné ou non?

    Précision le cas qui ne fonctionne pas est un cas ou avant de lancer cet exécutable j'en lance d'autre avant qui se terminent correcctement

    Une idée
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 978
    Points
    7 978
    Par défaut
    Peut être que le flux "erreur" contient un message. Je n'ai pas l'impression que tu "consommes" ce flux, si ?
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par wax78 Voir le message
    Peut être que le flux "erreur" contient un message. Je n'ai pas l'impression que tu "consommes" ce flux, si ?
    Si justement je le regarde et il n'y a rien. Je l'affiche après le p.WaitFor() ainsi que la sortie normale du code.
    Par ailleurs pour être sur que l’exécutable C fonctionne bien j'ai exécuté la ligne de commande hors interface avec les mêmes paramètres et ça fonctionne.
    Il semble qu'il y ai quelque chose qui empêche le lancement du process. Mais comme il n'y a pas d'information de retour je ne peux pas savoir où est le problème.
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 978
    Points
    7 978
    Par défaut
    Tu parles d'ici ? je pense qu'il y'a une petite erreur. Mais peut être que ton problème ne vient pas de la mais a vérifier quand même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    System.out.println("--------------Fin calcul profil----------------");
    ligne=brErr.readLine();
    while (ligne != null) {
    System.out.println("ERREUR ("+ligne+")");
    ligne=br.readLine();
    }
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut
    Oui c'est ça. Mais effectivement même après correction de l'erreur ça ne fonctionne pas mieux. Je veux dire par là que je n'ai aucun retour ni des sorties normales ni de la sortie erreur
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  6. #6
    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,

    Citation Envoyé par Gouyon Voir le message
    Y a t'il un moyen de savoir si la commande pb.start() a fonctionné ou non?
    Si start() ne fonctionne pas pour une raison ou une autre, tu as une exception.
    => Comment gère tu les exceptions ?


    Sinon quelques remarques :
    • Tu n'utilises pas le flux d'entrée du process. Dans ce cas il faut le fermer au plus tôt.
    • Il faut traiter TOUS les flux AVANT le waitFor(), et de préférences dans des threads distinct, sinon tu risques de bloquer tes process.
    • Si tu es sous Java 7, tu peux utiliser inheritIO() ou Redirect.INHERIT pour rediriger les flux dans la console, tu n'aura alors rien à gérer (à moins de vouloir récupérer le texte)...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	ProcessBuilder pb = new ProcessBuilder(args)
    		.inheritIO();
    	Process p = pb.start();
    	int res = p.waitFor();

    a++

  7. #7
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut
    Au niveau des exceptions l'extrait de code que j'ai donné est dans un try{} catch et je regarde les exceptions suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    try{
    ......
    } catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    Il n'y a aucune exception de levée
    Je suis sous java 8.
    Par contre si j'ai bien compris l'affichage des flux est inutile après le waitfor?
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  8. #8
    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 Gouyon Voir le message
    Par contre si j'ai bien compris l'affichage des flux est inutile après le waitfor?
    Ce n'est pas qu'il est inutile, c'est surtout que cela peut tout bloquer !


    => Pour chaque flux, il y a un "petit" buffer entre les deux process.
    Et les opérations d'entrée/sortie peuvent bloquer chaque process (le tiens ou celui que tu lances) si :
    • Tu lis un flux dont le buffer est vide (il n'y a rien dedans donc le process va attendre que quelque-chose soit écrit ou que le flux soit fermé de l'autre coté).
    • Si tu écris dans un flux dont le buffer est plein (l'écriture sera bloqué jusqu'à ce que le buffer soit vidé, ou que le flux soit fermé).


    Si tu fait le waitFor() avant de lire les données, le process que tu exécutes pourrait être bloqué en écriture.

  9. #9
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut
    Merci pour ces précisions.

    En fait je n'ai pas de blocage au niveau du code java. C'est juste que l'exécutable C renvoie une valeur qu'il ne devrait pas ce qui me fait penser qu'il s'est planté pour une raison indéterminée. Mais je n'arrive pas à savoir quelle est cette raison. C'est pour ça que je cherche à si le process a bien été lancé et pourquoi il ne me retourne rien alors qu'il devrait au moins me retourner une chaine de caractère qui est imprimée dès le lancement de l’exécutable en C.
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

Discussions similaires

  1. Serveur Xorg sur debian testing qui ne se lance pas
    Par Cyrius dans le forum Applications et environnements graphiques
    Réponses: 7
    Dernier message: 01/01/2006, 23h25
  2. Tâche qui ne se lance pas avec cron
    Par bugalood dans le forum Administration système
    Réponses: 3
    Dernier message: 17/10/2005, 18h13
  3. Réponses: 3
    Dernier message: 16/09/2005, 10h01
  4. mmc.exe qui ne se lance pas
    Par r0d dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 27/04/2005, 17h11

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