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 :

[QST] demarrer une application externe sans garder de lien avec elle


Sujet :

avec Java

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 389
    Points : 227
    Points
    227
    Par défaut [QST] demarrer une application externe sans garder de lien avec elle
    Bonjour a tous,

    Je cherche a lancer une application externe sans garder de contact avec celle-ci
    (A la façon d'un nohup sous unix).

    D'habitude pour lancer une appli j'utilise un code de ce type:

    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
     
    List<String> commandLine = new ArrayList<String>();
    commandLine.add(.......);
    commandLine.add(.......);
     
    Process p = null;
     
    try {
    	ProcessBuilder pb = new ProcessBuilder(commandLine);
    	pb.redirectErrorStream(true);
     
    	p = pb.start();
    	InputStream is = p.getInputStream();
    	InputStreamReader isr = new InputStreamReader(is);
    	BufferedReader br = new BufferedReader(isr);
    	String lineTmp = "";
    	while ( (lineTmp = br.readLine()) != null )
    		NullOutputStream.NULL_OUTPUT_STREAM.write(lineTmp.getBytes());
     
    	// j'ai supprimer ceci car je pensai que cela permettrai de faire ce que je veux
    	// p.waitFor();
    }
    catch .....
    malheureusement, ceci freeze mon IHM (et oui j'ai pas fait de thread vue que je ne veux pas que cette appli externe sois rattaché a mon processus).

    Donc savez vous comment je peux faire pour lancer mon appli externe ?

    je vous remercie d'avance pour votre aide

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


    Il suffit de fermer tout les flux du process :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            ProcessBuilder pb = new ProcessBuilder(commandLine);
    	Process process = pb.start();
     
            process.getErrorStream().close();
            process.getInputStream().close();
            process.getOutputStream().close();
    Ou bien, à partir de Java 7 en laissant le process hérité des mêmes flux d'entrées/sorties :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            Process process = new ProcessBuilder(commandLine)
                    .inheritIO().start();

    a++

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 389
    Points : 227
    Points
    227
    Par défaut
    Effectivement ta solution fonctionne.
    Par contre j'ai quelque question:

    Pour ta solution Java 6, pourquoi le fait de fermé les flux détache le process ?
    Pour ta solution Java 7, j'ai redirigé mais System.out et System.err vers des fichiers. Si je comprend bien la doc, le inheritIO va redirigé les flux standard de l'appli vers les flux standard de mon process java (et donc par extension, va redirigé dans les fichiers)?

    merci de ton aide

  4. #4
    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 hannibal.76 Voir le message
    Pour ta solution Java 6, pourquoi le fait de fermé les flux détache le process ?
    Le process reste toujours attaché à son parent d'une manière ou d'une autre.

    Le fait de fermer les flux les remplacent par des flux "vide" (comme /dev/null sous Linux), donc le process écrira dans le vide, et du coup il n'y a plus d'obligation de traiter ces flux, sans que cela ne pose problème...




    Citation Envoyé par hannibal.76 Voir le message
    Pour ta solution Java 7, j'ai redirigé mais System.out et System.err vers des fichiers. Si je comprend bien la doc, le inheritIO va redirigé les flux standard de l'appli vers les flux standard de mon process java (et donc par extension, va redirigé dans les fichiers)?
    J'avoue que je n'en sais rien... mais tu peux aussi les rediriger explicitement vers des fichiers si besoin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .redirectError(Redirect.appendTo(file))

    a++

  5. #5
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 389
    Points : 227
    Points
    227
    Par défaut
    Ok, nickel, je te remercie pour ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD16] Piloter une application externe sans bouger la souris
    Par WDKyle dans le forum WinDev
    Réponses: 3
    Dernier message: 17/07/2013, 09h51
  2. Réponses: 4
    Dernier message: 14/05/2012, 11h49
  3. Réponses: 2
    Dernier message: 27/07/2011, 11h40
  4. [PHP 5.0] Lancer une application externe et continuer sans attendre
    Par Jonahboss dans le forum Langage
    Réponses: 22
    Dernier message: 18/07/2009, 19h56
  5. Réponses: 12
    Dernier message: 23/01/2008, 09h17

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