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 :

Problème avec l'utilisation de Runtime.exec()


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 15
    Points : 12
    Points
    12
    Par défaut Problème avec l'utilisation de Runtime.exec()
    Bonjour,

    J'ai un problème avec l'utilisation de l'objet Runtime(). Je ne vais pas poster toutes les lignes de mon code, vu sa longueur, mais voici la partie en question (les noms choisis sont à titre indicatif) :

    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
    Runtime rt = Runtime.getRuntime();
    JButton bouton1= new JButton();
    JButton bouton2= new JButton();
     
    /* ... quelques lignes de codes... */
     
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == bouton1) {
        	action1();
        } else {
        	action2();
        }
    }
     
    public void action1() {
     
        try {
    	rt.exec("ma_commande1");
    	rt.exec("ma_commande2");
            bouton1.setEnabled(false);
            bouton2.setEnabled(true);
        } catch (IOException e) {
    	e.printStackTrace();
        }
    }
     
    public void action2() {
     
        try {
    	rt.exec("ma_commande3");
    	rt.exec("ma_commande4");
            bouton1.setEnabled(true);
            bouton2.setEnabled(false);
        } catch (IOException e) {
    	e.printStackTrace();
        }
    }
    Et donc, lors de l'appui sur le bouton1, la commande fonctionne et l'action 1 se réalise, mais quand j'appuie sur le bouton2, hormis la propriété "setEnabled", la commande n'est pas exécutée. Mais si j'appuie encore sur le bouton1, cette fois-ci c'est les commandes de l'action2 qui sont exécutées (donc celles d'avant) et pareil, si j'appuie ensuite sur le bouton2, c'est les commandes de l'action 1 qui sont exécutées. Et ça continue ainsi de suite, du coup, chaque bouton exécute l'action de l'autre.

    J'ai fais des recherches sur l'objet Process et Runtime, j'ai testé des choses avec waitFor(), mais ça ne donne rien. Peut-être que la réponse est toute bête ou pas, alors je viens vous demander si vous avez une idée d'où est-ce que cela peut venir.

    Merci d'avance !

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    D'abord, dans tes appels à exec, tu ne traite pas les entrées sorties de ton process, ce qui est mal et devrais toujours être fait. Ensuite, en l'état, ton problème n'est pas reproductible. Donne nous le vrai code. Notament, on ne voit pas l'appel/branchement du listener, la mise en plac des boutons dans l'interfaces, les sorties de ton exec, les erreurs éventuellement affichées dans la console. Vu ta description, je suppose que t'embrouille tes références aux boutons quelque part, mais difficile de dire où

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Merci de m'avoir répondu.

    En fait, je ne sais pas trop comment on utilise l'objet Runtime(). J'ai lu qu'il y avait bien des entrées et sorties à traiter, mais mes commandes n'affichent normalement rien au terminal. Plus précisément, ce sont des commandes permettant d'afficher/cacher les fichiers cachés sous Mac OS. Et je n'ai pas d'erreurs dans la console lorsque j'exécute mon programme. Voici le code complet (où les boutons exécutent, malheureusement, l'action de l'autre) :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    package gui;
     
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.GridLayout;
    import java.awt.Image;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.io.IOException;
     
    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JFrame; 
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
     
    public class Menu extends JFrame implements ActionListener {
     
    	private Image icone = Toolkit.getDefaultToolkit().getImage("images/files.ico");
    	private JButton afficher = new JButton();
    	private JButton cacher = new JButton();
    	private Runtime rt;
     
    	public Menu(String titre) {
    	    super(titre);
    	    this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
                this.setResizable(false);
                this.setContentPane(contenu());
                this.setIconImage(icone);
     
                this.addWindowListener(new WindowAdapter(){   
        	        public void windowClosing(WindowEvent evt)
        	       {
        	           quitter();
        	       }
        	    });
     
            pack();
           }
     
    	JPanel contenu() {
     
        	    JPanel content = new JPanel();		
        	    afficher = new JButton("Afficher les fichiers");
        	    cacher = new JButton("Cacher les fichiers");
        	    Font policebut = new Font("Trebuchet MS", Font.BOLD, 15);
     
        	    cacher.setEnabled(false);
     
        	    content.setLayout(new GridLayout(0,1));
        	    content.setBorder(BorderFactory.createEmptyBorder(30, 30, 30, 30));
        	    content.setBackground(Color.ORANGE);
     
                afficher.setFont(policebut);
                afficher.addActionListener(this);
                cacher.setFont(policebut);
                cacher.addActionListener(this);
     
                content.add(afficher);
                content.add(cacher);
     
                return content;
            }
     
            private void quitter() {
        	    if (JOptionPane.showConfirmDialog(this, "Voulez-vous vraiment quitter ?", "Quitter", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION)
                    System.exit(0);
            }
     
    	public void actionPerformed(ActionEvent e) {
     
    	    rt = Runtime.getRuntime();
     
    	    if(e.getSource() == afficher) {
    	    	afficherFichiers();
    	    } else {
    	    	cacherFichiers();
    	    }
    	}
     
            public void afficherFichiers() {
     
        	    try {
        	        rt.exec("defaults write com.apple.finder AppleShowAllFiles TRUE");
        		rt.exec("killall Finder");
        	        afficher.setEnabled(false);
        	        cacher.setEnabled(true);
        	    } catch (IOException e) {
        		e.printStackTrace();
        	    }
            }
     
            public void cacherFichiers() {
     
        	    try {
        	        rt.exec("defaults write com.apple.finder AppleShowAllFiles FALSE");
        	        rt.exec("killall Finder");
        	        cacher.setEnabled(false);
        	        afficher.setEnabled(true);
        	    } catch (IOException e) {
        		e.printStackTrace();
        	    }
            }
     
    	public static void main(String[] args) {
    		Menu menu = new Menu("Mes Fichiers Cachés");
    		menu.setLocationRelativeTo(null);
    		menu.setVisible(true);
    	}
     
    }

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Si je comprend bien tu exécute une commande destinée à changer le comportement de Finder (comportement 1), puis tu killall Finder et ça ne fait rien.
    Ensuite tu exécute une commande pour passer au comportement 2, tu kill finder et tu te retrouve avec le comportement 1
    Ensuite tu exécute une commande pour passer au comportement 1, tu kill finder et tu te retrouve avec le comportement 2

    Donc en gros Finder a un comportement de retard, ce qui devrait te titiller et te dire que tu redémarrer Finder trop vite. Commence par essayer ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                    new ProcessBuilder("defaults","write","com.apple.finder AppleShowAllFiles","TRUE").inheritIO().start().waitFor();
                    new ProcessBuilder("killall","Finder").inheritIO().start().waitFor();
    Ca traite correctement les IOs et ça attends que les commandes soient terminées. Bien sur idéalement il faudrait faire ça en dehors du Thread EDT pour ne pas le bloquer.

    Si ça ne suffit pas, faudra peut être rajoute un sleep (beurk) entre les deux.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Oui c'est exactement ça.

    J'ai essayé et maintenant seule l'action d'afficher les fichiers fonctionne. Celle de cacher les fichiers ne marche pas. Et j'ai des messages à la console lors de l'appui sur un bouton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    2016-06-06 20:01:38.513 defaults[1578:757298] 
    Rep argument is not a dictionary
    Defaults have not been changed.
    2016-06-06 20:01:40.624 defaults[1583:757646] 
    Rep argument is not a dictionary
    Defaults have not been changed.
    Aussi qu'entendez-vous par "en dehors du Thread EDT" ? (parce que je pense que là il est bloqué) Je croyais que ce Thread ne servait que pour les éléments graphiques.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    oui et un bouton c'est quoi. Un élément graphique. Les évenements tournent dans l'EDT qu'il faut éviter de bloquer.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Alors j'ai essayé le ProcessBuilder à l'extérieur du Thread EDT, avec et sans sleep(), mais ça ne marche pas. Par contre en faisant de même avec Runtime.exec() (et sans sleep()), ça fonctionne. Donc c'était bien un problème d'exécution de tâches comme vous l'avez souligné dans votre deuxième message (le Finder redémarrait trop vite). Pour ma part ce problème est résolu. Merci de votre aide.

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

Discussions similaires

  1. Problème avec l'utilisation de LogMessage
    Par vanquish dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 17/11/2005, 10h18
  2. Problème avec l'utilisation d'un module
    Par goblin dans le forum Modules
    Réponses: 4
    Dernier message: 09/11/2005, 20h55
  3. Problème avec l'utilisation de librairies
    Par Aradesh dans le forum MFC
    Réponses: 3
    Dernier message: 01/08/2005, 15h00
  4. [debutant] problème avec type à utiliser
    Par mlequim dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 15/07/2005, 16h08
  5. Problème avec l'utilisation de la fonction clock
    Par Matgic95 dans le forum C++Builder
    Réponses: 13
    Dernier message: 09/05/2005, 19h27

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