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

Langage Java Discussion :

Runtime.getRuntime().exec() lance 2 fois le processus ?


Sujet :

Langage Java

  1. #1
    Invité
    Invité(e)
    Par défaut Runtime.getRuntime().exec() lance 2 fois le processus ?
    Bonjour à tous,

    Je développe une petite interface destinée à simplifier l'utilisation du lecteur multimédia mplayer pour écouter diverses radio. J'ai donc développé une interface swing extrêmement simple, qui permet d'afficher une liste de radio et de lancer la lecture d'un flux via mplayer.

    J'ai donc pour cela recours à la méthode suivante :
    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
     
    public static void play (Radio radio)
    {
    	String cmdString = "mplayer -nolirc -cache 1024 -afm acm " + radio.getUrl();
    	try
    	{
    		if (LockHandler.exists()) {
    			stopPlayback();
    		}
     
    		LockHandler.createLock();
    		Process p = Runtime.getRuntime().exec(cmdString.split(" "));
    	}
    	catch (IOException ex) {
    		Logger.getRootLogger().fatal("Could not launch \"" + cmdString + "\" command");
    	}
    }
    Ce code est lancé lors du clic sur un JButton. Mais après vérification, la commande en question est lancée non pas une, mais 2 fois, d'où un mauvais fonctionnement de la lecture des flux. Pourtant après vérification, la méthode play() n'est bien lancée qu'une seule fois. D'où ma question, savez-vous pourquoi ma commande est lancée 2 fois et non pas une ??

    Merci de votre aide

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    y a pas de raison. Qu'est-ce qui te fais croire qu'elle est lancée deux fois. Par définition, exec lance 1 application, donc elle retourne les informations dans une instance de Process.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Un "ps aux | grep mplayer" qui m'affiche 2 processus mplayer essayant d'accéder au même flux, tout simplement. Sinon je suis bien d'accord avec ton message, d'où mon interrogation

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    essaie du pas à pas pour voir si t'as effectivement 2 process juste après l'appel à exec. T'as bien un seul process quand tu lance depuis la console?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Rebonjour,
    Après vérification, j'ai bien 2 process de créés dès l'appel à la méthode exec(). Et qu'entends-tu par lancer depuis la console ? Mon application vient dans un jar, si tu parles de lancer le jar via le "java -jar nomdu.jar", le résultat est bien le même, 2 mplayer lancés. Je vais tenter le coup avec une autre commande pour voir si le résultat est le même.


    Edit : Après test avec une autre commande (en l'occurence vlc), le problème est bien identique, et n'est donc pas spécifique à la façon de lancer le processus mplayer...
    Dernière modification par Invité ; 08/02/2010 à 15h32.

  6. #6
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 574
    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 574
    Points : 15 538
    Points
    15 538
    Par défaut
    Si tu met un System.out.println("Démarrage mplayer"); juste avant le Runtime.exec(), le message n'est affiché qu'une seule fois?

  7. #7
    Invité
    Invité(e)
    Par défaut
    Oui effectivement. C'est d'ailleurs le premier test que j'avais tenté lorsque je me suis aperçu du problème. J'avoue en perdre un peu mon latin... Merci à tous ceux qui tentent de m'aider en tout cas

  8. #8
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Pour être absolument sûr que la commande est lancée deux fois, tu peux lancer un script (shell/batch) intermédiaire qui lui lancera ton player et qui fera aussi autre chose qui te permettra d'avoir un résultat visible (lancer une autre appli, créér un fichier, ...).

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

    Es-tu sûr qu'il n'y a pas également 2 process lorsque tu le lances directement depuis une console ?


    Sinon ne pas oublier de traiter ou fermer les flux. C'est très important surtout sous Unix/Linux !

    a++

  10. #10
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Désolé de détourner un peu le sujet, mais pourrais-tu détailler un peu ceci: (ou donner un lien )
    Citation Envoyé par adiGuba Voir le message
    Sinon ne pas oublier de traiter ou fermer les flux. C'est très important surtout sous Unix/Linux !

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Es-tu sûr qu'il n'y a pas également 2 process lorsque tu le lances directement depuis une console ?
    Oh mon Dieu je n'avais pas vérifié ça. En effet, il y a bien 2 process de lancés lorsque je lance la commande à la main. Merci adi !

    Me reste à déterminer pourquoi le streaming est moins efficace quand je lance la commande via mon application Java que lorsque je la lance directement depuis une console... Quand j'avais remarqué qu'il y avait 2 mplayer tournant en même temps, j'avais cru à tort que le problème venait de là, sans même vérifier le fonctionnement normal de la commande...


    Merci de votre aide en tout cas, sujet résolu

  12. #12
    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
    Les flux d'E/S des process que tu lances sont reliés à l'application Java par des buffer de taille relativement petite. Si tu ne les utilises pas cela peut bloquer le programme une fois qu'ils sont plein.

    Donc il faut impérativement les traiter ou les fermer immédiatement :


    Sous Windows les applications graphiques (Win32) n'ont pas de vrai flux d'E/S, donc ils sont toujours vide et ce n'est pas gênant (même si c'est préférable de le faire).

    Par contre sur les autres systèmes, les flux d'E/S sont toujours présent, même s'ils sont "perdu" lorsqu'ils sont lancé en mode graphique.

    Et généralement ces programmes peuvent utiliser ces flux pour logger des infos. Si le programme loggue un peu trop cela peut remplir le buffer et il peut se retrouver bloqué si de ton coté tu n'a pas traiter (ou fermer) le flux...


    a++

  13. #13
    Invité
    Invité(e)
    Par défaut
    J'étudierai cette piste pour mon problème. Merci des explications adi

  14. #14
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Citation Envoyé par PierreAd Voir le message
    Oh mon Dieu je n'avais pas vérifié ça. En effet, il y a bien 2 process de lancés lorsque je lance la commande à la main. Merci adi !
    que j'avais demandé dans mon deuxième post :'(

  15. #15
    Invité
    Invité(e)
    Par défaut
    Oui, au temps pour moi !...mais il a fallu que l'on me le dise une seconde fois pour que je comprenne ce que vous vouliez dire par là (cf ma réponse à ton 2° post justement ). Donc merci à toi aussi, puisque sans ton 2° post, je n'aurai sans doute pas pigé ce que voulait dire adiGuba.
    Dernière modification par Jannus ; 09/02/2010 à 12h52. Motif: Citation inutile

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

Discussions similaires

  1. Runtime.getRuntime().exec exécute le processus après la fin du programme Java
    Par scalande dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 14/02/2012, 17h56
  2. [Système][Runtime]getRuntime().exec
    Par Neptune8 dans le forum API standards et tierces
    Réponses: 11
    Dernier message: 22/02/2011, 19h34
  3. Runtime.getRuntime().exec(String) méthode sort
    Par devAd dans le forum Langage
    Réponses: 4
    Dernier message: 28/11/2006, 13h53
  4. [Runtime.getRuntime().exec] ouvrir un fichier ??
    Par miloud dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 29/03/2006, 14h23
  5. [Swing] execution avec Runtime.getRuntime().exec
    Par benssj5 dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 25/08/2004, 14h54

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