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

API standards et tierces Java Discussion :

[Runtime] Appel système bloquant..


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut [Runtime] Appel système bloquant..
    Bonjour,

    J'ai besoin de convertir des documents pdf en html.
    pour cela j'utilise pdftohtml.
    Je fais un appel système avec le commande voulue. Tout cela fonctionne trés bien pour certains pdf mais pas pour tous..

    Voici le code de convertion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      command = CONVERTER + CONVERTER_ARGS + " \"" + copy + "\"";
      System.out.println("\t Convertion de " + copy + " avec la commande " + command );
      Process p = runtime.exec(command);	
      System.out.println(".");
      p.waitFor();
      System.out.println(original + " eval = " + p.exitValue());
    Il semblerais que les pdf de moins de 560ko passent sans problèmes (pourtant en commande manuelle la convertion aboutit quelque soit la taille)

    deux questions :
    runtime.exec(..) est il limité à un cretains temps ( plus la fichier est gros plus il faut du temps pour le convertir) ec qui expliquerais que je nepasse jamais à la suite.
    Comment savoir si le process fonctionne toujours et le couper éventuellement ? (mon but serait alors de prévenir que la convertion à echouée..)

    Merci

  2. #2
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    En quelle version de java es-tu ?
    Si tu es en 1.5, à voir runtime.exec n'est pas des plus simple

    Sinon, cet article contient de toutes façon des informations intéressantes sur le "remplissage" des buffers in et out

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par chtig
    En quelle version de java es-tu ?
    en 1.6

    Citation Envoyé par adiGuba
    Si le programme lancé utilise les flux d'E/S stdin/stdout/stderr,..
    He bien lorsque je lance la commande à la main sans il m'affche le numéro des pages qu'il convertit :
    Citation Envoyé par pdftohtml.exe
    C:\>pdftohtml.exe -c "C:\DOCUME~1\B1635~1.GER\LOCALS~1\Temp\pdfconverter32193\tm
    p_GEN[fr]_Cours Java.pdf"
    link to page 3 link to page 4 link to page 5 link to page 5 link to page 6
    link to page 7 link to page 7 link to page 8 link to page 8 Page-1
    link to page 10 link to page 17 link to page 18 link to page 22 link to pag
    e 22 link to page 24 link to page 26 link to page 29 link to page 29 link t
    o page 32 link to page 34 link to page 34 link to page 36 link to page 36 l
    ink to page 36 link to page 38 link to page 38 link to page 39 link to page
    39 link to page 39 link to page 43 link to page 44 link to page 44 link to
    page 46 link to page 47 link to page 48 link to page 49 link to page 49 lin
    k to page 50 link to page 50 link to page 52 link to page 52 link to page 54
    link to page 54 link to page 54 link to page 55 link to page 56 link to pa
    ge 59 link to page 63 link to page 63 link to page 63 link to page 64 link
    to page 64 link to page 65 link to page 65 link to page 65 link to page 65
    link to page 65 link to page 66 link to page 66 link to page 68 link to page
    69 link to page 70 link to page 70 link to page 71 link to page 72 link to
    page 72 link to page 74 link to page 75 link to page 75 link to page 76 Pag
    e-2
    link to page 77 link to page 77 link to page 77 link to page 79 link to pag
    e 81 link to page 82 link to page 83 link to page 83 link to page 84 link t
    o page 85 link to page 85 link to page 86 link to page 86 link to page 89 l
    ink to page 91 link to page 91 link to page 91 link to page 92 link to page
    92 link to page 93 link to page 93 link to page 94 link to page 95 link to
    page 95 link to page 96 link to page 96 link to page 96 link to page 101 li
    nk to page 102 link to page 102 link to page 105 Page-3
    Page-4
    Page-5
    Page-6
    link to page 6 Page-7
    Page-8
    Page-9
    Page-10
    Page-11
    Page-12
    Page-13
    etc..
    c'est de ça que tu veux parler ?
    Je les traite comment alors ? Avec Process.getInput/OutputStream ?

  4. #4
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Blaise1
    c'est de ça que tu veux parler ?
    Oui !
    Citation Envoyé par Blaise1
    Je les traite comment alors ? Avec Process.getInput/OutputStream ?
    Deux solutions :
    • Soit tu décides de les ignorer et tu les fermes avant de faire le waitFor() :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      	Process p = runtime.exec(command);	
       
      	p.getOutputStream().close();
      	p.getInputStream().close();
      	p.getErrorStream().close();
       
      	p.waitFor();
    • Soit tu écris/lis dedans (selon le cas) depuis des threads séparé.

    Si tu ne fais pas cela, les données en sorties du programme natif sont conservé dans un buffer jusqu'à ce qu'il soit plein, puis le programme natif est bloqué en écriture...

    Pour plus de détail tu peux voir le lien donné par chtig ou même directement utiliser l'API qui y est présenté : runtime.exec n'est pas des plus simple


    a++

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci adiGuba je viens de lire ton article. J'ai essayé de fermer les flux et sela fonctionne sans problèmes. Merci beaucoup.

    Mais il me reste une question. J'ai essayé de lire les flux input et error, je me suis donc crée un petite classe interne :
    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
     
      private class InputReader extends Thread {
     
        private BufferedReader reader;
     
        public InputReader(InputStream in) {
          reader = new BufferedReader(new InputStreamReader(in));
        }
     
        @Override
        public void run() {
          System.out.println("Démarrage de la lecture");
          String line = null;
          try {
            while ( (line = reader.readLine()) != null )
              System.out.println(line);
          } catch (IOException e) {
            e.printStackTrace();
          } finally {
            try {
              reader.close();
            } catch (IOException e) {
              e.printStackTrace();
            }
          }
        }		
    }
    et rajouté ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    command = CONVERTER + CONVERTER_ARGS + " \"" + copy + "\"";
    System.out.println("\t Convertion de " + copy + " avec la commande " + command );
    Process p = runtime.exec(command);	
    new InputReader(p.getInputStream()).start();
    new InputReader(p.getErrorStream()).start();
    p.getOutputStream().close();
    p.waitFor();
    Mais il y à deux choses :
    1° il semblerais qu'il faille un peu de temps entre l'apparition des premières lignes dans certains cas. Cela est sans grande importance.
    2° En appel manuel j'ai ceci à la fin de l'éxécution :
    'gswin32c' n'est pas reconnu en tant que commande interne
    ou externe, un programme exécutable ou un fichier de commandes.
    Error: Failed to launch Ghostscript!
    Alors qu'avec l'appel Java je ne l'ai pas...

    Ha non désolé, en fait la sortie est trés grande et dans le scroll j'ai ratté cette partie. Etant donné que les deux lectures se font dans un un Thread séparé, le message d'erreur à étét affiché avant la fin de la sortie standard.

    Tout fonctione.

    Merci

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Comment savoir si le process fonctionne toujours et le couper éventuellement ?
    Process.waitFor() et Process.abort() devrait suffire, non ?

  7. #7
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    Si le programme lancé utilise les flux d'E/S stdin/stdout/stderr, il faut obligatoirement les traiter afin d'éviter les inter-blocages...

    Et dans le pire des cas il faut au moins les fermer (et éventuellement perdre l'information)

    a++

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

Discussions similaires

  1. appel système en c sous linux
    Par momoh dans le forum POSIX
    Réponses: 5
    Dernier message: 03/12/2006, 18h34
  2. Réponses: 3
    Dernier message: 20/06/2006, 07h06
  3. [UBUNTU] Ajout nouvel appel système ?
    Par [Margot] dans le forum Ubuntu
    Réponses: 5
    Dernier message: 11/05/2006, 14h11
  4. appel système opendir dans thread
    Par madimane dans le forum POSIX
    Réponses: 2
    Dernier message: 14/04/2006, 05h39
  5. Réponses: 2
    Dernier message: 05/03/2006, 19h29

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