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

IO Java Discussion :

Process qui ne se lance pas


Sujet :

IO Java

  1. #1
    Membre éprouvé
    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
    Venez vous défouler ici ou c'est amusant
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  2. #2
    Modérateur

    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 éprouvé
    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
    Venez vous défouler ici ou c'est amusant
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  4. #4
    Modérateur

    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 éprouvé
    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
    Venez vous défouler ici ou c'est amusant
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  6. #6
    Expert éminent sénior
    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++
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  7. #7
    Membre éprouvé
    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
    Venez vous défouler ici ou c'est amusant
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  8. #8
    Expert éminent sénior
    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.
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  9. #9
    Membre éprouvé
    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
    Venez vous défouler ici ou c'est amusant
    Mon modeste site et mes modestes oeuvres sont
    Rémi