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 :

timer puis affichage


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de lostsoul
    Homme Profil pro
    Rédacteur web, blogueur, développeur web junior
    Inscrit en
    Novembre 2003
    Messages
    762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Rédacteur web, blogueur, développeur web junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2003
    Messages : 762
    Par défaut timer puis affichage
    Bonjour,

    Je lance, depuis le programme en Java, 3 commandes linux, et je voudrais afficher les 3 résultats, mis à jour grâce à un timer, dans 3 jtextfield différent.
    Le soucis, c'est que je n'ai que le premier résultat qui s'affiche...
    Pas de msg d'erreur, et je ne vois pas pourquoi les autres ne fonctionnent pas.
    Si quelqu'un voit mon erreur svp ?

    Je suis donc sous linux, avec Netbeans.


    Les déclarations :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Process proc1;
        Process proc2;
        Process proc3;
        BufferedReader entree1;
        BufferedReader entree2;
        BufferedReader entree3;
        String ligne1;
        String ligne2;
        String ligne3;
    Le lancement du timer au lancement du programme : t.start();

    Et le 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
     
    Timer t = new Timer(12000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ev) {
     
                try {
                proc1 = Runtime.getRuntime().exec("acpi -t");
                proc2 = Runtime.getRuntime().exec("top -n1 | grep -w 'Cpu(s)'");
                proc3 = Runtime.getRuntime().exec("top -n1 | grep -w 'Mem'");
     
                entree1 = new BufferedReader(new InputStreamReader(proc1.getInputStream()));
                    while ((ligne1 = entree1.readLine()) != null) {
                        jTextField1.setText(ligne1 + "\n");
                    }
     
                    entree2 = new BufferedReader(new InputStreamReader(proc2.getInputStream()));
                    while ((ligne2 = entree2.readLine()) != null) {
                        jTextField2.setText(ligne2 + "\n");
                    }
     
                    entree3 = new BufferedReader(new InputStreamReader(proc3.getInputStream()));
                    while ((ligne3 = entree3.readLine()) != null) {
                        jTextField3.setText(ligne3 + "\n");
                    }
     
     
                } catch (Exception e) {
                JOptionPane.showMessageDialog(null, e.toString(), "Problème", JOptionPane.ERROR_MESSAGE);
                }
     
            }
        });


    Merci d'avance,
    Très cordialement,

    ANDRE Ani

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Hello,

    sous linux, la commande top ne prend pas de paramètre | ni grep ni -w ni 'Cpu(s)' ni 'Mem'
    Devant tous ces paramètre inconnus, la commande ne s'exécute donc pas. À la place elle écrit un message d'erreur sur la sortie d'erreur, que tu ne lis pas. Tu ne peux donc pas voir ce qui se passe mal.

    Le symbole | de redirection de flux, est un opérateur de shell, or exec() n'est pas un shell. On lui donne un nom de programme et ses paramètres, et il demande au système d'exploitation d'exécuter ce programme et ces paramètres. Le système d'exploitation n'est pas un shell non plus, top n'est pas un shell non plus, et donc rien de tout ça ne sait quoi faire de ton | bizarre ou de ce qu'il y a après.
    Pour pouvoir utiliser ce symbole, il faut demander à un shell d'exécuter cette commande. Ça ressemblerait à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    proc2 = Runtime.getRuntime().exec("sh -c 'top -n1 | grep -w \"Cpu(s)\"'");
    Comme c'est un peu compliqué, on va découper cette chaîne unique "la commande à lancer" en un tableau de chaînes "la commande suivie de ses paramètres". Ça donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    proc2 = new ProcessBuilder("sh", "-c", "top -n1 | grep -w 'Cpu(s)'").start();
    Reste à faire en sorte d'avoir une visibilité sur les erreurs quand quelque chose se passe mal. On va faire en sorte que la sortie d'erreur de sh et donc de top, soit redirigée vers la sortie d'erreur du programme Java (et donc s'affiche dans la console.)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    proc2 = new ProcessBuilder("sh", "-c", "top -n1 | grep -w 'Cpu(s)'")
              .redirectError(Redirect.INHERIT)
              .start();
    Et ajouter un message d'erreur si le code de retour de sh donc de top, n'est pas "0 tout s'est bien passé" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // après avoir fini de lire l'InputStream correspondant :
    if(proc2.waitFor() != 0) {
      System.err.println("proc2 terminated with error exit code: " + proc2.exitValue());
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé Avatar de lostsoul
    Homme Profil pro
    Rédacteur web, blogueur, développeur web junior
    Inscrit en
    Novembre 2003
    Messages
    762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Rédacteur web, blogueur, développeur web junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2003
    Messages : 762
    Par défaut
    Bonjour,

    Merci pour les explications ;-)
    J'avais déjà lancé une commande un peu comme cela, mais je l'avais mise dans un script je crois.

    J'ai une erreur quand même, et je ne sais pas d'où elle vient. Je n'ai pas de variables d'environnement, ou alors, c'est le shell ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TERM environment variable not set.
    proc2 terminated with error exit code: 1
    En plus, j'aurais préféré avoir des valeurs plus lisible (genre en %), mais je n'ai pas trouvé de commandes faisant cela. Ou alors, n'afficher que les 4 ou 5 premières lignes de top, ce qui serait plus simple en fait que de lancer 3 commandes...

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/07/2007, 10h27
  2. Masquage d'une div puis affichage d'une autre
    Par pierreonxbox dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 22/05/2007, 14h00
  3. stocker image dans exe, puis affichage suivant un code ?
    Par pierre987321 dans le forum Delphi
    Réponses: 4
    Dernier message: 24/04/2007, 23h08
  4. Préchargement de page puis affichage ?
    Par thibaut06 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 03/01/2007, 21h19
  5. Sélection liste déroulante puis affichage de text box
    Par dolu007 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 11/11/2006, 00h03

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