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

Mono .NET Discussion :

[Mono/C#] Comment rediriger le output d'une commande vers un textview ?


Sujet :

Mono .NET

  1. #1
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Points : 52
    Points
    52
    Par défaut [Mono/C#] Comment rediriger le output d'une commande vers un textview ?
    Bonjour à tous!
    Bonne vacances au étudiants

    Bon, le coeur du problème...
    J'écris une petite application qui aura comme but de piloter le programme wvdial qui fonctionne en mode console sous linux. Ce programme sert à la connection d'un modem basse vitesse.

    Lorsqu'il est lancé en mode console beaucoup d'informations utiles sont affichés.
    Je veux récupéré ces infos et les afficher dans un textview. Ce textview est en GTK# / mono...

    Présentement, lorsque je lance mon application, elle se ferme de sitôt.
    Voici mon code. J'ai remplacé le wvdial par un ping pour éviter le lancement du modem à toutes les fois...

    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
     
        protected virtual void btnConnect_Click(object sender, System.EventArgs e)
        {
            // On désactive le shell
            ProcWvdial.StartInfo.UseShellExecute = false;
            // On redirige la sortie standard
            ProcWvdial.StartInfo.RedirectStandardOutput = true;
            ProcWvdial.StartInfo.FileName = "ping -c 3";
            //ProcWvdial.StartInfo.FileName = "sudo /usr/bin/wvdial";
            ProcWvdial.StartInfo.Arguments = "www.google.com";
            // Démarrage de la commande
            ProcWvdial.Start();
            // Lecture de la sortie de la commande
            string output = ProcWvdial.StandardOutput.ReadToEnd();
     
            Gtk.TextBuffer buffer;
            buffer = textview1.Buffer;
            buffer.Text = output;
     
            //Console.WriteLine(output);
            // Attente de la fin de la commande
            ProcWvdial.WaitForExit();
        }
    J'ai repris le code de la FAQ

    J'ai également un autre problème pour interrompre la connection ( ProcWvdial.Kill(); ) mais on verra plus tard...une chose à la fois

    Merci de votre aide!

    @+

  2. #2
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    salut .

    tu n'as pas un message d'erreur ? de plus tu fait appels à une commande admin (sudo ping ...) est tu sur que ça soit autorisé ?

    Je n'ai pas (encore) étudié le model de sécurité de Mono mais je ne pense pas que lancer des commandes root soit accepté par défaut .
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  3. #3
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Points : 52
    Points
    52
    Par défaut
    Bonjour Dev01.

    Le message qui m'est donné par monodevelop lors du crash:
    Unhandled Exception: System.ComponentModel.Win32Exception: Cannot find the specified file
    in [0x001f5] (at /mnt/data/tmp/archcvs/extra/devel/mono/src/mono-1.1.15/mcs/class/System/System.Diagnostics/Process.cs:959) System.Diagnostics.Process:Start_noshell (System.Diagnostics.ProcessStartInfo startInfo, System.Diagnostics.Process process)
    in [0x00040] (at /mnt/data/tmp/archcvs/extra/devel/mono/src/mono-1.1.15/mcs/class/System/System.Diagnostics/Process.cs:996) System.Diagnostics.Process:Start_common (System.Diagnostics.ProcessStartInfo startInfo, System.Diagnostics.Process process)
    in [0x00007] (at /mnt/data/tmp/archcvs/extra/devel/mono/src/mono-1.1.15/mcs/class/System/System.Diagnostics/Process.cs:1003) System.Diagnostics.Process:Start ()
    in (wrapper remoting-invoke-with-check) System.Diagnostics.Process:Start ()
    in [0x00052] (at /home/shaika-dzari/Projects/Wvc/Wvc/MainWindow.cs:43) MainWindow:btnConnect_Click (System.Object sender, System.EventArgs e)
    in (wrapper delegate-invoke) System.MulticastDelegate:invoke_void_object_EventArgs (object,System.EventArgs)
    in <0x00093> GLib.Signal:voidObjectCallback (IntPtr handle, IntPtr gch)
    in (wrapper native-to-managed) GLib.Signal:voidObjectCallback (intptr,intptr)
    in <0x00000> <unknown method>
    in (wrapper managed-to-native) Gtk.Application:gtk_main ()
    in <0x00007> Gtk.Application:Run ()
    in [0x00011] (at /home/shaika-dzari/Projects/Wvc/Wvc/Main.cs:14) Wvc.MainClass:Main (System.String[] args)
    Pour sudo, j'ai créé une règle dans /etc/sudoers pour autorisé tous les utilisateurs à lancé la commande sudo wvdial sans mot de passe.(oui je sais, c'est pas secure...)

    Merci de ton aide!

    @+

    Edit: Ce message est avec le lancement du ping vers google. J'ai pas encore essayé avec wvdial mais je suppose que le résultat serait le même.

  4. #4
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Tu travail bien sous Linux ?

    Est tu sur que le fichier vers lequel ou depuis lequel tu veux rediriger existe bien ?

    tu utilise bien stdin stdout ou stderr ?
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  5. #5
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Points : 52
    Points
    52
    Par défaut
    Bonjour Dev01

    Oui, je suis bien sous linux. J'utilise archlinux 0.7.2 / kernel 2.6.16 avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    shaika-dzari:$ mono --version                                                 ~
    Mono JIT compiler version 1.1.15, (C) 2002-2005 Novell, Inc and Contributors. www.mono-project.com
            TLS:           normal
            GC:            Included Boehm (with typed GC)
            SIGSEGV:       normal
            Disabled:      none
    Ainsi que monodevelop 0.11.

    Mon problème réside peut-être dans la méthode au lieu d'une quelquonque erreur.
    Ce que je veux c'est récupéré l'affichage console, exemple, de la commande ping www.google.ca et la faire apparaître dans ma fenètre; le textview finalement.

    Si tu veux jeter un oeil au projet (il est assez simple...), tu peux le télécharger ici:
    http://perso.b2b2c.ca/mangaquebec/devel/Wvc.tar.bz2

    tu utilise bien stdin stdout ou stderr ?
    Je suis désolé mais je ne sais pas ce que c'est.

    Merci encore de ton aide.

    @+

  6. #6
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Salut .

    j'ai trouvé ton erreur .

    il ne faut pas passer les arguments d'un programme dans le FileName .

    Tu as une propriété Arguments je crois dans StartInfo qui est faite pour ça .

    Essai et tiens moi au courant.
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  7. #7
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Points : 52
    Points
    52
    Par défaut
    HiHa!

    Tu as raison par toutadis!

    Je vais modifier le tout pour afficher en direct dans le textview et ça sera super.

    Merci bien Dev01.

    @+

  8. #8
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Points : 52
    Points
    52
    Par défaut
    Rebonjour!

    J'aurais une dernière question.

    Avec le code plus haut (légèrement modifié et corrigé) l'affichage console du logiciel s'effectue dans mon textview.

    J'utilise le .ReadToEnd() qui une fois la commande effectuée affiche le output complet de celle-ci.

    Comme mon application sert à piloter un logiciel en mode console et que ce logiciel continue à fonctionner après la fin de ma fonction, est-il possible que l'affichage se produise en directe et de façon continue?

    L'application pilotée en console est wvdial et donne de l'infos sur le modem pendant la navigation.
    J'aimerais que cette info soit constament mise à jour dans le textview avec un jolie "\n\r" à chaque fin de ligne

    Merci encore de votre aide!

    @+

  9. #9
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    salut .

    tu essayé de refaire un readtoend ?

    genre tu lances un thread, tu lance ton process, tus bloque pendant 2 secondes le thread puis tu fait un ReadToEnd et tu boucle sur le ReadToEnd comme ça tant que le programme est en cours
    ???
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  10. #10
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Points : 52
    Points
    52
    Par défaut
    Je vais essayé ça Dev01.

    Bon dieux, t'a été rapide sur la réponse!

    5 minutes...

    @+

  11. #11
    Candidat au Club
    Inscrit en
    Mai 2005
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Tu peux aussi te brancher sur l'evenement de sortie de ligne commande
    et y ajouter un ecouteur. Ainsi tu ne bloque pas ton thread principal avec waitforexit();

    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
    protected virtual void btnConnect_Click(object sender, System.EventArgs e)
            {
                // On désactive le shell
                ProcWvdial.StartInfo.UseShellExecute = false;
                // On redirige la sortie standard
                ProcWvdial.StartInfo.RedirectStandardOutput = true;
                ProcWvdial.StartInfo.FileName = "ping -c 3";
                //ProcWvdial.StartInfo.FileName = "sudo /usr/bin/wvdial";
                ProcWvdial.StartInfo.Arguments = "www.google.com";
                // Démarrage de la commande
                
                ProcWvdial.OutputDataReceived +=
     new System.Diagnostics.DataReceivedEventHandler(ProcWvdial_OutputDataReceived);            
                ProcWvdial.Start();
                // Lecture de la sortie de la commande
                ProcWvdial.BeginOutputReadLine();
                //string output = ProcWvdial.StandardOutput.ReadToEnd();
    
                //Gtk.TextBuffer buffer;
                //buffer = textview1.Buffer;
                //buffer.Text = output;
                //Console.WriteLine(output);
                //// Attente de la fin de la commande
               //ProcWvdial.WaitForExit();
            }
    
            void ProcWvdial_OutputDataReceived
    (object sender, System.Diagnostics.DataReceivedEventArgs e)
            {
                textview1.Buffer = output;
            }

  12. #12
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Points : 52
    Points
    52
    Par défaut
    Merci ORB99

    Dès que j'ai une minute, j'essais ta solution.

    @+

  13. #13
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Points : 52
    Points
    52
    Par défaut
    Bonsoir.

    Le DataReceivedEventHandler n'est malheureusement pas encore présent dans mon installation de mono.
    J'ai vu sur le cvs que le nécessaire avait été fait pour implenter le tout.

    Je vais essayé un jolie while et si ça ne marche pas, je vais attendre une mise à jour de mono.
    D'ailleurs sur leurs site j'ai peut-être vu une autre solution qui me conviendrait.

    Merci à tous de votre aide.

    @+

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

Discussions similaires

  1. [Batch] Rediriger la sortie d'une commande vers une variable
    Par Merwyn dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 28/09/2012, 17h30
  2. Réponses: 3
    Dernier message: 11/03/2008, 00h22
  3. Réponses: 8
    Dernier message: 19/09/2007, 16h51
  4. Réponses: 22
    Dernier message: 09/12/2005, 21h27
  5. Rediriger les erreurs d'une commande
    Par GLDavid dans le forum Langage
    Réponses: 9
    Dernier message: 10/11/2005, 21h03

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