Hi,
ich möchte die Konsole im Hintergrund ausführen um einen Download über das Konsolenprogramm "rtmpdump" zu realisieren.
Wenn ich rtmpdump händisch über die Konsole starte und einen entsprechenden Link mitliefere, wird gedownloaded. Der aktuelle Fortschritt (in %) wird am Ende des Konsolenfensters angezeigt. Das soll jetzt automatisiert geschehen und der aktuellen Fortschritt in % soll auf einer Form erscheinen.
Ein Konsolenfenster im Hintergrund starte ich derzeit so:
System.Diagnostics.Process myProc = new System.Diagnostics.Process();
myProc.StartInfo.FileName = Environment.GetEnvironmentVariable("COMSPEC");
myProc.StartInfo.CreateNoWindow = true;
myProc.StartInfo.RedirectStandardInput = true;
myProc.StartInfo.RedirectStandardOutput = true;
myProc.StartInfo.UseShellExecute = false;
myProc.Start();
Jetzt erstelle ich einen Reader und Writer um in das Konsolenfenster zu schreiben und es auszulesen:
System.IO.StreamWriter myWriter;
System.IO.StreamReader myReader;
myWriter = myProc.StandardInput;
myWriter.AutoFlush = true;
Dann setzte ich die Befehle (dlString ist ein string mit einem Aufruf von rtmpdump.exe und einem Downloadpfad) in der Konsole ab:
myWriter.WriteLine("ECHO ON");
myWriter.WriteLine("cd bib");
myWriter.WriteLine(dlString);
Soweit funktioniert - scheinbar - alles. Zonealarm meldet sich und frägt ob rtmpdump.exe in das Internet kommunizieren darf.
Und nun möchte ich die Konsole alle paar Sekunden komplett mit dem Reader auslesen, und hier klemmts. Ich versuche es im Moment so:
myReader = myProc.StandardOutput;
string tmp = "";
tmp = myReader.ReadToEnd();
tmp = System.Text.Encoding.GetEncoding(850).GetString(System.Text.Encoding.Default.GetBytes(tmp));
MessageBox.Show(tmp);
Wenn ich den letzten Teil ausführe hängt die komplette Form.. liegt das irgendwie an dem ReadToEnd() ? Wenn ich beim Writer noch ein "WriteLine("EXIT")" dranhänge, dann funktioniert es, aber nur EINMAL. Und gedownloaded wird auch nix. Bin ratlos 🤔
Vielleicht weiß ja jemand weiter?!
LG,
Micha
Schau Dir dies mal an.
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Hi,
danke für die super Vorlage.
Leider wirft die Klasse bei mir eine Exception, hab ich sie falsch eingebunden?
VirtualConsole myConsole = new VirtualConsole();
myConsole.Left = 5;
myConsole.Top = 5;
myConsole.Height = 100;
myConsole.Width = 200;
myConsole.Show();
myConsole.Visible = true;
In der Zeile:
if (s != string.Empty)
{
this.Invoke(new AddStringDelegate(this.AddString), new object[] { s, addNewLine });
}
wird die Exception
Fehlermeldung:
Invoke oder BeginInvoke kann für ein Steuerelement erst aufgerufen werden, wenn das Fensterhandle erstellt wurde.
geworfen. Das gleiche Problem hatte auch schon jemand anderes in dem von dir bereitgestellten Thread.
VG
Such in [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke) mal nach CreateHandle
Nachtrag: Oder dasselbe hier: Threadübergreifender Vorgang trotz InvokeRequired
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Alles klar, jetzt wirft das ganze zumindest keine Exception mehr.
Habe im Konstruktor des Controls, über base, das Handle erstellt.
Nur erscheinen tut die ConsolenBox noch immer nicht. Ist der Aufruf in meinem vorherigen Post korrekt?
Danke & LG
EDIT: Dummer Fehler. Habe vergessen dem Control das Parent zuzuweisen. Jetzt klappt alles. Werde mal damit arbeiten und mich ggf. wieder melden.
Vielen herzlichen Dank für die Unterstützung!
@VBMichi: Kannst du schon die Konsole Ausgabe von rtmpdump lesen? Ich versuche mal auch die Ausgabe von rtmpdump zu lesen aber es klappt aber noch nicht.
Eingabe:
rtmpdump.exe -r rtmp://gffstream.fcod.llnwd.net/a792/e2/tv/rockpalast/live/2010/haldern10_feine_kleine_dorfmusik.mp4 -o output.mp4
Ausgabe:
Bitte siehe Anhang.
Diese Ausgabe kann ich nicht auslesen. Die OutputDataReceived gibt nichts raus nachdem rtmpdump wird aufgerufen.