StartInfo RedirectStandardOutput --> StreamReader bleibt leer :(

Christian Kusmanow

Erfahrenes Mitglied
Hallo Tutorialer!

OMG, ich bekomm einfach keinen StatdartOutput von meinem Prozess.
Folgendes habe ich vorbereitet und vereinfachter Form siehts so aus:
Code:
void PrepareToEncode() {
	ProcessStartInfo StartInfo = new ProcessStartInfo( cAppName );
	StartInfo.Arguments = _Arguments.ToString();
	StartInfo.ErrorDialog = false;
	StartInfo.CreateNoWindow = true;
	StartInfo.UseShellExecute = false;
	StartInfo.RedirectStandardOutput = true;

	string Path = Assembly.GetExecutingAssembly().Location.Replace("/", "\\");
	StartInfo.WorkingDirectory = Path.Substring( 0, Path.LastIndexOf( '\\' ) );

	_Process.StartInfo = StartInfo;
}
Soweit so gut. Der folgene Part wird in einem Thread ausgeführt.
sieht ein bissel spartanisch aus. Ich wollt euch aber nicht den Threading.Timer antun,
damit ihr das noch nachvollziehen könnt was hier passiert.
Code:
public void Encode() {
	
	PrepareToEncode();
	_Process.Start();

	// Report zur GUI. Event wird gefeuert, Daten bleiben aber aus.
	while( !_Process.HasExited ){ 
		OnUpdateProgress ( _Process.StandardOutput.ReadToEnd() );
		Thread.Sleep( 500 );
	}
}
Das ist mein bisheriger Ansatz. Das Ganze funktioniert auch soweit.
Auch kann ich einfach auf das beenden des Vorgangs mit Process.Exited reagieren.

Das einzige was nun nicht geht, ist das abgreifen des OutPuts.
Auf Google, in der MSDN und auf TheCodeProject hab nichts dazu gefunden. :(
Ist das etwa Schwachsinn, so wie ich das versuche? Warum geht das nicht?

MfG, cosmo
 
Re: StartInfo.RedirectStandardOutput --> StreamReader bleibt leer :(

Die while-Schleife brauchst du da nicht.

Code:
ProcessStartInfo ps = new ProcessStartInfo("...", "...");
ps.UseShellExecute = false;
ps.RedirectStandardOutput = true;
Process p=new Process();
p.Start(ps);
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();
 
Re: StartInfo.RedirectStandardOutput --> StreamReader bleibt leer :(

Hallo Norbert!

Jo, nach dem Beispiel aus der MSDN.
Ich möcht aber den Status einer Encoder.exe abgreifen währen encodiert wird.
Wie stelle ich das an? Geht das überhaupt?

lg, cosmo
 
  1. Weisst was, ich hab grad festgestllt das des nur mit bestimmten Progammen nicht geht.
    Bestimmte Encoder Programme, wie die lame.exe zB, geben keien Standart OutPut zurück.
    Andere Consolen Programme geben einen zurück.
    Wie hängt das zusammen, obwohl alle in cpp geschrieben und Consolen basiert sind?
    Ich hab dafür jetzt mal ein ConsolenProjekt explizit zum ausprobieren erstellt.
    Brauchst blos die EXE in den Programmordner kopieren.
    Das Proramm findet sie und fragt ob sie ausgeführt werden soll.
    Sag mir doch bitte was ich da blos falsch mache, sofern ich was falsch mache.

  2. Das Beispiel aus der MSDN sah für mich von vornherrein,
    nach starten und abgreifen des OutPuts nach Prozess Ende aus.
    Ich möcht den OutPut aber permanent abgreifen.
    Hab mir den MSDN Content zum Process.StandardOutput Property nochmal genau
    durch gelesen.
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdiagnosticsprocessclassstandardoutputtopic.asp hat gesagt.:
    If a child process writes enough data to the pipe to fill the buffer, the child will block until the parent reads the data from the pipe.
    Heisst das jetzt das ich das genze, so wie ich es machen will, vergessen kann? :confused:

    Es ist wichtig, bin am verzweifeln. :(
    Ich hab gestern noch einen Ansatz gefunden der garantiert funktioniert.
    Nur müsst ich mir dafür ne DLL in cpp kompilieren wofür ich keine config hab.
    Ergo wird das garantiert ein hässliches gefummel
    und ich müsste mich in die API des encoders einarbeiten.
    was ich wegen extremer Zeitnot erstmal vermeinden wollte.
lg, cosmo
 

Anhänge

  • ProcessOutPutReader.zip
    8,9 KB · Aufrufe: 86
Hallo cosmo.

Lame scheint in den StandardError - Stream zu schreiben.

MfG,
Alex

p.s. (edit)
Du kannst auch ruhig Zeilenweise lesen. Wirst dir dann beim Verarbeiten der Infos glaub ich etwas leichter tun, oder? ;)
 
Hey, KLASSE! Es geht. Danke Dir Alex! :)

Nur ein Problem habe ich noch.
Ich hab das jetzt so in den Threading.Timer eingebaut und es auch nochmal mit der while-Schleife versucht.
Irgendiwe scheint der Thread des OutPutReaders zu blocken bis die exe beendet wurde.
Oder weisst Du einen Weg, wie ich das Umgehen kann?
Wie kann das sein das die Console zB permanent den OutPut erhält
und das System.Diagnostics.Process Objekt evtl. nicht? :confused:

Ich glaub die Aussage aus der MSDN scheint hier absolut zuzutreffen, oder?

lg, cosmo
 
Wie meinst das der Thread blockt? Liest du mit ReadToEnd? Dann liest er ja solange bis der Stream zu ist.
Versuch doch einfach in einem Thread immer Zeilenweise zu lesen mit ReadLine.
 
ARGH, verdammt.
Ja das habe ich. :-(
Jetzt versteh ich's auch. OMG, wie konnte ich das vergessen, das ist ja logisch.

Danke Dir für deine kompetente Hilfe! :)

Besten Gruß, cosmo
 
Zurück