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

Java Discussion :

proc.waitFor() : Lancement d'une commande extérieure WINWORD ou soffice.exe


Sujet :

Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 58
    Points : 46
    Points
    46
    Par défaut proc.waitFor() : Lancement d'une commande extérieure WINWORD ou soffice.exe
    Bonjour,

    j'ai créé un programme java permettant de lancer une commande extérieure pour éditer un document de type Office ou OpenOffice.

    J'utilise la méthode proc.waitFor() pour attendre la fin d'exécution de mon processus externe. Cela fonctionne plutôt bien sauf si une instance de ce programme est déjà lancée.

    Prenons l'exemple de l'édition d'un document OpenOffice, si j'ai déjà le programme OpenOffice lancé sur ma machine (soffice.exe dans la liste des processus), l'instruction proc.waitFor() va considérer "bizarrement" que le programme a immédiatement terminé son exécution...

    voici mon code :

    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
    38
    39
    40
    41
     
    package launchexternalprocess;
     
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.security.AccessController;
    import java.security.PrivilegedActionException;
    import java.security.PrivilegedExceptionAction;
     
    public class LaunchExternalProcess {
     
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) throws  Exception{
            // TODO code application logic here
            LaunchExternalProcess launchExternalProcess = new LaunchExternalProcess();
            final String exec = "C:\\programmes\\openoffice\\program\\soffice.exe C:\\Users\\myUser\\tmp\\thefile.odt";
     
            //Process p = Runtime.getRuntime().exec("cmd /c dir");
            Process proc = launchExternalProcess.launchApp(exec);
     
            int ev = 0;
            if (proc.waitFor() != 0) {
                ev = proc.exitValue();
            }
            System.out.println(ev);
        }
     
        public Process launchApp(final String launchPath) throws PrivilegedActionException {
            Process proc = (Process) AccessController.doPrivileged(
                new PrivilegedExceptionAction() {
                    public Object run() throws IOException {
                        return Runtime.getRuntime().exec(launchPath);
                    }
                }
            );
            return proc;
        }
    }
    Il y a t'il une méthode plus adéquate ?

    Merci par avance pour vos conseils.

  2. #2
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 493
    Points
    15 493
    Par défaut
    Citation Envoyé par soulryo Voir le message
    Prenons l'exemple de l'édition d'un document OpenOffice, si j'ai déjà le programme OpenOffice lancé sur ma machine (soffice.exe dans la liste des processus), l'instruction proc.waitFor() va considérer "bizarrement" que le programme a immédiatement terminé son exécution...
    Tout est normal, c'est bien ce qu'il se passe. Le processus "soffice.exe" que tu as créé, voyant qu'un processus soffice.exe existe déjà, va lui transmettre la tache d'ouverture du document et se terminer. Cela évite d'avoir plusieurs processus ouvert en même temps.

    Par contre c'est clairement un soucis pour ce que tu veux réaliser vu que l'API Java ne permet pas d’effectuer d'opération sur les processus que l'on a pas créé.
    Pour faire ça il te faudrait recourir a des bibliothèque natives ou **attention, très moche** à analyser régulièrement le retour de l’exécution des commandes système tasklist(windows) ou ps(Linux/MacOS X)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 58
    Points : 46
    Points
    46
    Par défaut
    Ok Uther,

    Même dans le cas où le processus n'a pas été lancé par l'appli java mais par l'utilisateur du poste ?

    Dommage que java ne sache pas gérer les processus déjà créés.

    Et apparemment OpenOffice ne sait pas gérer un mode multiprocessus...

Discussions similaires

  1. pb sur le lancement d'une commande tftp
    Par Stef_M dans le forum Langage
    Réponses: 4
    Dernier message: 19/03/2008, 11h53
  2. Lancement d'une commande ou d'un .bat
    Par jbrasselet dans le forum ASP
    Réponses: 1
    Dernier message: 06/09/2007, 16h21
  3. [DOS] Lancement d'une commande en arrière plan
    Par be_tnt dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 19/06/2007, 15h34
  4. [débutant]lancement d'une commande Unix ou LInux depuis Java
    Par msiramy dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 30/09/2005, 18h10
  5. Lancement d'une commande sur un serveur Unix
    Par lper dans le forum Web & réseau
    Réponses: 2
    Dernier message: 29/07/2004, 13h58

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