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

C# Discussion :

lecture de la sortie standard


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 18
    Par défaut lecture de la sortie standard
    Bonjour,
    j'ai un problème concernant la lecture de la sortie standard d'un processus.
    je me suis d'abord fortement inspiré de cette page http://jab.developpez.com/tutoriels/...ess/synchrone/ , ainsi que de la doc msdn pour la lecture syncrhone ou asynchrone mais je n'arrive pas à lire la sortie.

    Donc pour revenir a mon programme, je lance un "process". durant l'execution de ce processus la sortie standard evolue toute les secondes. J'aimerai pouvoir enregistrer une de ces informations pour faire évoluer une barre de chargement.

    voila mes bout de 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    md = new MessageDialog (this, DialogFlags.DestroyWithParent,
    						               		MessageType.Info, ButtonsType.Cancel,"test","");
     
    			//on crée le thread de lecture des infos
    			Thread readInfo = new Thread(new ThreadStart(this.readOutput));
     
    			ProcessStartInfo processInfo = new ProcessStartInfo("povray");
    			processInfo.Arguments = InfoProj.getPathProj() + InfoProj.getNameProj() + ".ini";
     
    			//on déroute la sortie standard
    			processInfo.UseShellExecute = false;
    			processInfo.CreateNoWindow = true;
    			processInfo.RedirectStandardOutput = true;
    			outPov = new StringBuilder("");
     
     
    			povRender = new Process();
    			povRender.StartInfo = processInfo ;
    			// on utilise l'événement pour savoir quand le processus est terminé
    			povRender.EnableRaisingEvents = true ;
    			povRender.Exited += new EventHandler(this.renderEnded);
     
    			povRender.Start();
     
    			// on démarre le thread de lecture
    			readInfo.Start();
    			// on affiche la fenêtre de progression
     
    			md.Run();
     
                           textviewMain.Buffer.Text = myString ;
     
            private void readOutput()
    	{
    		while (! povRender.HasExited)
    		{
                           StreamReader povOutPut = povRender.StandardOutput  ;
                           myString += povOutPut.ReadLine();			
    		}
    	}
    voila, je vous passe mon test de lecture asynchrone, la seul difference est que, au lieu d'un thread de lecture j'ai un DataReceivedEventHandler et j'utilise la fonction beginOutputReadLine(). Je précise que je n'ai pas d'ereur a la compilation ou l'execution mais je recupere indubitablement un string vide, alors que la "sortie de l'application" de mon IDE me montre bien les informations que je cherche a récupérer

    par contre je n'ai pas tres bien saisie la difference entre lecture synchrone de la sortie et lecture asynchrone. Dans mon cas laquelle me conseilleriez vous ?

    Je vous remercie d'avance pour vos reponses, en esperant avoir été le plus clair possible
    Jerome

  2. #2
    Membre expérimenté
    Inscrit en
    Octobre 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Octobre 2007
    Messages : 236
    Par défaut
    Ajoute la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    povRender.WaitForExit()
    après la ligne :
    et avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    textviewMain.Buffer.Text = myString;
    Parceque comme tu affiche le contenu de la sortie standard en un seul coup du processus exécuté, il serait préférable attendre son Exit.

  3. #3
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 18
    Par défaut
    merci de ta réponse emmr.rida
    mais il me semble que je l'avais deja testé
    quoiqu'il en soit je vient de retenter et mon string reste désespérément vide

    je me demandais, puisque je redirige la sortie du processus elle ne devrai plus être écrite dans la console non ? parce que dans mon cas la console continue a l'afficher ...

    j'avais oublié de le copier une partie de mon code dans le post précédent :
    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
     
                            md.Run();
    			povRender.WaitForExit();     //rajout proposé
     
     
    			// On vérifie si le processus est fini.
    			// Si ce n'est pas le cas, l'utilisateur a appuyé sur stop
    			// et il faut fermer le processus. Le thread est fermé après l'arrêt 
    			// du processus
    			if ( !povRender.HasExited )
    			{
    				povRender.Kill();
    				povRender.WaitForExit();
    			}
     
    			exitCode = povRender.ExitCode ;
    			System.Console.WriteLine(exitCode);
     
    			povRender.Close();
    			textviewMain.Buffer.Text = myString ;
     
    	protected void renderEnded(object sender, EventArgs args){
     
    		md.Destroy();
     
    	}
    il me semble que l'ouverture de la messageDialogue fais deja office de WaitForExit() et donc le code qui suit me permet de verifier si j'appuie sur le bouton cancel de la messageDialogue. Si je place donc un WaitForExit() entre les deux, meme si j'appuie sur cancel pendant l'execution le processus attendra la fin de l'execution ...
    merci tout de même pour ta proposition

  4. #4
    Membre expérimenté
    Inscrit en
    Octobre 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Octobre 2007
    Messages : 236
    Par défaut
    Le processus que t'exécutes, est ce qu'il écrit dans la sortie standard. J'ai créé un petit programme qui lis la sortie standard d'un autre processus que j'ai testé en premier avec Calc.exe qui n'écrit rien, mais qui affiche quelque chose avec cmd.exe.

  5. #5
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 18
    Par défaut
    je voie, donc si je comprend bien, là, la sortie que j'essaie de lire est en faite la sortie de Mon application qui effectivement n'écrit rien, c'est pour ca que mon string reste vide ...

    pourtant je croyais que le bute de ces lignes de codes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                            processInfo.UseShellExecute = false;
    			processInfo.CreateNoWindow = true;
    			processInfo.RedirectStandardOutput = true;
     
                           StreamReader povOutPut = povRender.StandardOutput  ;
    était justement de rediriger la sortie du processus que je veux lire et de la placer dans un flux (stream reader ...)
    dans ce cas quelle serai la marche a suivre pour que je recupère la sortie du processus que j'execute et non pas la sortie de Mon application ? Puisque tu as créé un programme de lecture de la sortie standard peut tu m'envoyer un bout de code qui pourrai m'éclairer ?
    merci encore pour ton aide

    edit : je vien d'essayer d'ecrire dans la sortie standard de mon application pour verifier, et mon string reste toujours vide ... je pense que le problème ne viens pas de là, à mon avis je doit faire une erreur dans la redirection du flux ...

  6. #6
    Membre expérimenté
    Inscrit en
    Octobre 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Octobre 2007
    Messages : 236
    Par défaut
    Ce que je voulais dire, c'est que si le processus "povRender" n'écris rien dans son propre sortie standard, la string dans ton code restera à null.
    Moi, pour comprendre mieux le problème de ton post, j'ai créé un petit programme qui lit la sortie standard d'autres processus selon ta méthode. Quand j'essais avec Calc.exe, mon code ne lit rien alors quand j'essais avec cmd.exe mon code affiche la sortie de la ligne de commande.

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

Discussions similaires

  1. PB sortie standard avec les PTHREAD !!!
    Par djspit dans le forum C++
    Réponses: 15
    Dernier message: 19/11/2004, 01h17
  2. [langage] sortie standard linux
    Par ebaynaud dans le forum Langage
    Réponses: 8
    Dernier message: 14/10/2004, 08h05
  3. rediriger la sortie standard vers un textarea
    Par gromite dans le forum Composants
    Réponses: 9
    Dernier message: 10/05/2004, 11h07
  4. Réponses: 5
    Dernier message: 24/12/2003, 09h49
  5. Réponses: 16
    Dernier message: 18/07/2003, 17h16

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