Senden input/erste Ausgabe aus der console-Anwendung (C#/WinForms)
Ich habe ein Formular mit 3 Steuerung:
- Eine textbox für die Eingabe
Befehle zum senden an eine Konsole
Anwendung, - Eine Taste zum bestätigen der Befehle
gesendet werden und - Ein nur-lese-Textfeld zur Anzeige der
Ausgabe der Anwendung.
Was ich will, ist für die Benutzer zur Eingabe von Befehlen in das erste Textfeld, und drücken Sie die Taste und geben und erhalten feedback über die zweite textbox.
Ich weiß, wie Sie ProcessStartInfo.RedirectStandardOutput
aber, aber, die app hängt sich auf wenn ich StandardOutput.ReadToEnd()
.
Hatte ich einen Blick auf die asynchrone Process.BeginOutputReadLine()
aber, auch wenn mir die app nicht hängen, irgendwie bekomme ich keine Antwort in der textbox, es bringt absolut nichts.
Hier ist mein code:
public partial class MainForm : Form
{
private void MainForm_Load(object sender, EventArgs e)
{
InitializeInterpreter();
}
private void InitializeInterpreter()
{
InterProc.StartInfo.UseShellExecute = false;
InterProc.StartInfo.FileName = "app.exe";
InterProc.StartInfo.RedirectStandardInput = true;
InterProc.StartInfo.RedirectStandardOutput = true;
InterProc.StartInfo.RedirectStandardError = true;
InterProc.StartInfo.CreateNoWindow = true;
InterProc.OutputDataReceived += new DataReceivedEventHandler(InterProcOutputHandler);
InterProc.Start();
}
private static void InterProcOutputHandler(object sendingProcess, DataReceivedEventArgs outLine)
{
if (!String.IsNullOrEmpty(outLine.Data))
{
OutputTextBox.Append(Environment.NewLine + outLine.Data);
}
}
private void Enterbutton_Click(object sender, EventArgs e)
{
InterProc.StandardInput.Write(CommandtextBox.Text);
InterProc.BeginOutputReadLine();
}
}
Gibt es eine Möglichkeit, ich kann diese reibungslos laufen? Danke.
<dumm Author>Sie wissen, Sie können dies tun, ohne Umleitung der standard-in/out?</Stumme Kommentar - > ich nehme an, Sie testen wollen, wie re-Richtung funktioniert, aber Sie haben nicht erklärt, dass Sie Ihre Frage an alle.
Kannst du bitte etwas erläutern?
"Was ich will, ist für die Benutzer zur Eingabe von Befehlen in das erste Textfeld, und drücken Sie die Taste und geben und erhalten feedback über die zweite textbox" meinen Sie eigentlich "einen Befehl eingeben (die würde normalerweise führen Sie in einer Eingabeaufforderung/"dos" - Fenster), führen Sie den Befehl in den hintergrund, und zeigen Sie die Befehle, die Ausgabe in die zweite text-box"? Wenn ja, ignorieren, was ich gerade sagte.
Yep, das ist es, was ich meinte.
Kannst du bitte etwas erläutern?
"Was ich will, ist für die Benutzer zur Eingabe von Befehlen in das erste Textfeld, und drücken Sie die Taste und geben und erhalten feedback über die zweite textbox" meinen Sie eigentlich "einen Befehl eingeben (die würde normalerweise führen Sie in einer Eingabeaufforderung/"dos" - Fenster), führen Sie den Befehl in den hintergrund, und zeigen Sie die Befehle, die Ausgabe in die zweite text-box"? Wenn ja, ignorieren, was ich gerade sagte.
Yep, das ist es, was ich meinte.
InformationsquelleAutor Zach | 2009-11-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie möchten, dass etwas interaktives, ich habe diesen code (deins geändert, details über änderungen unten)
So, ich zog die BeginOutputReadLine nur, nachdem der Prozess gestartet wird. , Die sicherstellt, dass es wirklich nur einmal aufgerufen. Ich habe auch ein invoke notwendig zu bereinigen thread-Aufrufe. Hoffentlich sollte dies für Sie arbeiten.
So, ich habe diesen code, und es funktionierte bei mir einwandfrei. Geschrieben habe ich eine benutzerdefinierte ausführbare Datei, hallte alles zu mir zurück. Die Interaktivität hat gut funktioniert.
Wenn die ausführbare Datei ist nicht bereit, eine Nachricht, nicht erhalten noch. So, vielleicht ist das problem in der lua.exe? Versuchen Einhaken es bis zu einer anderen app?
Es scheint, als ob etwas falsch mit lua.exe auch mit StdError. Es arbeitet mit anderen exe ' s aber nicht lua.exe. Naja...
Es funktioniert nicht mit octave.exe weder
InformationsquelleAutor McKay
Die beste Lösung, die ich gefunden habe, ist:
InformationsquelleAutor Jader Dias
Ive verwendet code so etwas wie dieses:
Aber es ist nicht interaktiv. Aber wenn die app ist interaktiv, es werden viel mehr code sowieso.
Durch die "Interaktive" meinst du, dass Sie möchten, um Daten an den standard in der Programm? Oder einfach, es wird als update in der app-Ausgabe. Das erstere ist ein bisschen härter als die letzteren. In jedem Fall, Sie beschweren sich, dass ReadToEnd ist, was hängt, wenn Sie Sie nicht verwenden, dass in deinem Beispiel-code. Was ist eigentlich das problem, oder können wir sehen, den neuen code?
InformationsquelleAutor McKay
Wo rufen Sie an
StandardOutput.ReadToEnd()
? Ich hatte mal ein ähnliches problem, da war ich aufrufenProcess.WaitForExit()
vorStandardOutput.ReadToEnd()
. Ich hatte eine große Menge von input-und den output-buffer voll war vor der Fertigstellung, und meinen Prozess wurde blockiert.Rufen Sie
StandardOutput.ReadToEnd()
vorProcess.WaitForExit()
.InformationsquelleAutor Dour High Arch