Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Konsole (cmd) aus Windows Forms Anwendung auslesen - GUI hängt
VBMichi
myCSharp.de - Member



Dabei seit:
Beiträge: 28
Herkunft: Karlsruhe

Themenstarter:

Konsole (cmd) aus Windows Forms Anwendung auslesen - GUI hängt

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von VBMichi am .
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4.221
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Schau Dir dies mal an.

Console als Steuerelement einbinden.
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
private Nachricht | Beiträge des Benutzers
VBMichi
myCSharp.de - Member



Dabei seit:
Beiträge: 28
Herkunft: Karlsruhe

Themenstarter:

beantworten | zitieren | melden

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
Fehler
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
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4.221
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Such in [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke) mal nach CreateHandle

Nachtrag: Oder dasselbe hier: Threadübergreifender Vorgang trotz InvokeRequired
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Programmierhans am .
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
private Nachricht | Beiträge des Benutzers
VBMichi
myCSharp.de - Member



Dabei seit:
Beiträge: 28
Herkunft: Karlsruhe

Themenstarter:

beantworten | zitieren | melden

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!
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von VBMichi am .
private Nachricht | Beiträge des Benutzers
rongchaua
myCSharp.de - Member



Dabei seit:
Beiträge: 100

beantworten | zitieren | melden

@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.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von rongchaua am .
Attachments
private Nachricht | Beiträge des Benutzers