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#

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 18
    Points : 13
    Points
    13
    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 actif
    Inscrit en
    Octobre 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2007
    Messages : 236
    Points : 233
    Points
    233
    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 à l'essai
    Inscrit en
    Mai 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 18
    Points : 13
    Points
    13
    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 actif
    Inscrit en
    Octobre 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2007
    Messages : 236
    Points : 233
    Points
    233
    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 à l'essai
    Inscrit en
    Mai 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 18
    Points : 13
    Points
    13
    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 actif
    Inscrit en
    Octobre 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2007
    Messages : 236
    Points : 233
    Points
    233
    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.

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Dacord, j'avais mal compris ta réponse, désolé.
    Ceci me laisse d'ailleur dubitatif ...
    de toute évidence si mon string reste vide c'est que le processus ne doit rien ecrire dans la sortie standard ...
    ca me parai étrange, lorsque je lance ce programme en console en dehors de mon application je récupère pourtant des informations de ce genre en console :
    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
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
     
    povray: cannot open the user configuration file /home/zygou/.povray/3.6/povray.conf: No such file or directory
    Persistence of Vision(tm) Ray Tracer Version 3.6.1 (Debian  (i486-linux-gnu-g++
     4.3.3 @ i486-pc-linux-gnu))
    This is an unofficial version compiled by:
     Clément Stenac <zorglub at debian dot org> for Debian <www.debian.org>
     The POV-Ray Team(tm) is not responsible for supporting this version.
    POV-Ray is based on DKBTrace 2.12 by David K. Buck & Aaron A. Collins
    Copyright 1991-2003 Persistence of Vision Team
    Copyright 2003-2004 Persistence of Vision Raytracer Pty. Ltd.
     
    Primary POV-Ray 3.5/3.6 Developers: (Alphabetically)
      Chris Cason         Thorsten Froehlich  Nathan Kopp         Ron Parker        
     
    Contributing Authors: (Alphabetically)
      Steve Anger         Eric Barish         Dieter Bayer        Steve A. Bennett  
      David K. Buck       Nicolas Calimet     Aaron A. Collins    Chris Dailey      
      Steve Demlow        Andreas Dilger      Alexander Enzmann   Dan Farmer        
      Mark Gordon         Christoph Hormann   Mike Hough          Chris Huff        
      Kari Kivisalo       Lutz Kretzschmar    Jochen Lippert      Pascal Massimino  
      Jim McElhiney       Douglas Muir        Juha Nieminen       Bill Pulver       
      Eduard Schwan       Wlodzimierz Skiba   Robert Skinner      Yvo Smellenbergh  
      Zsolt Szalavari     Scott Taylor        Massimo Valentini   Timothy Wegner    
      Drew Wells          Chris Young       
     
    Other contributors are listed in the documentation.
     
    Support libraries used by POV-Ray:
      ZLib 1.2.3.3, Copyright 1995-1998 Jean-loup Gailly and Mark Adler
      LibPNG 1.2.27, Copyright 1998-2002 Glenn Randers-Pehrson
      LibJPEG 6b, Copyright 1998 Thomas G. Lane
      LibTIFF 3.8.2, Copyright 1988-1997 Sam Leffler, 1991-1997 SGI
    Redirecting Options
      All Streams to console..........On 
      Debug Stream to console.........On 
      Fatal Stream to console.........On 
      Render Stream to console........On 
      Statistics Stream to console....On 
      Warning Stream to console.......On 
    Parsing Options
      Input file: vase.pov (compatible to version 3.61)
      Remove bounds........On 
      Split unions.........Off
      Library paths:
        /usr/share/povray
        /usr/share/povray/ini
        /usr/share/povray/include
    Output Options
      Image resolution 320 by 240 (rows 1 to 240, columns 1 to 320).
      Output file: /home/zygou/pov/vase.png, 24 bpp PNG
      Graphic display......On  (gamma: 2.2)
      Mosaic preview.......Off
      CPU usage histogram..Off
      Continued trace......Off
    Tracing Options
      Quality:  9
      Bounding boxes.......On   Bounding threshold: 3
      Light Buffer.........On 
      Vista Buffer.........On   Draw Vista Buffer....Off
      Antialiasing.........Off
      Clock value:    0.000  (Animation off)
     
      0:00:00 Parsing
    File: vase.pov  Line: 93
    Parse Warning: Illegal Value: Scale X by 0.0. Changed to 1.0.
    File: vase.pov  Line: 93
    Parse Warning: Illegal Value: Scale Z by 0.0. Changed to 1.0.
     
      0:00:00 Creating bounding slabs
      0:00:00 Creating vista buffer
      0:00:00 Creating light buffers 0K tokens
    Scene Statistics
      Finite objects:            5
      Infinite objects:          2
      Light sources:             1
      Total:                     8
     
      0:00:00 Displaying
    Using 24 bit TrueColor visual
    Mapping background image
     
      0:00:00 Rendering line 1 of 240
    Rendering Warning: Camera is inside a non-hollow object. Fog and participating
     media may not work as expected.
      0:00:03 Rendering line 202 of 240
      0:00:03 Done Tracing
    Render Statistics
    Image Resolution 320 x 240
    ----------------------------------------------------------------------------
    Pixels:            76800   Samples:           76800   Smpls/Pxl: 1.00
    Rays:              90090   Saved:                 0   Max Level: 10/10
    ----------------------------------------------------------------------------
    Ray->Shape Intersection          Tests       Succeeded  Percentage
    ----------------------------------------------------------------------------
    Box                              30883             138      0.45
    CSG Intersection                 82561           36249     43.91
    CSG Merge                        30883            9727     31.50
    Lathe                            61766           27813     45.03
    Lathe Bound                      61766           50432     81.65
    Plane                           295708          147836     49.99
    Prism                            18710           11594     61.97
    Prism Bound                      18710           18710    100.00
    Sphere Sweep                     64434             852      1.32
    Superellipsoid                   25839           13973     54.08
    True Type Font                  284229            4545      1.60
    Bounding Box                    185973          123964     66.66
    Light Buffer                    475757          331674     69.72
    Vista Buffer                    423063          367383     86.84
    ----------------------------------------------------------------------------
    Roots tested:                102983   eliminated:                    0
    Calls to Noise:              151676   Calls to DNoise:          142180
    ----------------------------------------------------------------------------
    Shadow Ray Tests:            103201   Succeeded:                 13087
    Reflected Rays:                3634   Total Internal:             3634
    Refracted Rays:                9656
    ----------------------------------------------------------------------------
    Smallest Alloc:                   9 bytes
    Largest  Alloc:              307208 bytes
    Peak memory used:            591569 bytes
    Total Scene Processing Times
      Parse Time:    0 hours  0 minutes  0 seconds (0 seconds)
      Photon Time:   0 hours  0 minutes  0 seconds (0 seconds)
      Render Time:   0 hours  0 minutes  3 seconds (3 seconds)
      Total Time:    0 hours  0 minutes  3 seconds (3 seconds)
    et, lorsque je lance le meme programme à partir de mon application je récupère les meme information dans la sortie de mon application ...
    il faudrai donc que j'éssai de lire la sortie de mon application et non pas celle de mon precessus ?
    pour un processus je fais : processus.StandardOutput
    mais alors comment puije faire pour lire la sortie de mon application ?

    edit : Et bien oui tu avais raison, comme l'indiquais les évidences mon processus ne retourne rien dans la sortie standard. je vien de faire un test avec un autre processus et cela fonctionne parfaitement
    en faite mon processus ecrit dans la sortie d'erreur ... ... ... meme lorsqu'il effectue toute les operation sans ereur ... ... ...
    J'ai un peu honte d'etre resté bloqué sur un probleme aussi bete ... pour la suite je me débrouillerai sans probleme ou au pire je reviendrai demander de l'aide.
    Je te remercie beaucoup pour ton aide et je te souhaite une bonne soirée
    Jerome

+ 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