私は小さなラッピングアプリケーションを使用して、既存のコンソールアプリケーションにGUIを提供しています。私はProcessStartInfo
とProcess
クラスを使用して.exeにバインドし、次にBeginErrorReadLine()
とBeginOutputReadLine()
を使用して、メッセージを新しいGUIにリダイレクトします。コンソールがConsole.Write()
の代わりにConsole.WriteLine()
を呼び出す場合を除き、すべてが正常に動作します。この場合、Write
に渡されるテキストはまったく表示されません。私は、WriteLine
関数がテキストの後に改行を挿入し、Write
メソッドがそうでないために問題があると思うでしょう。これを回避する方法はありますか?元のコマンドラインプログラムのWrite
からWriteLine
に変更することはできません。入力を求めるプロンプトにはWrite
が使用されています。プロセスの折り返し、一部の出力が表示されない
関連するコード:
var startInfo = new ProcessStartInfo(ServerFile);
startInfo.RedirectStandardInput = true;
startInfo.RedirectStandardError = true;
startInfo.RedirectStandardOutput = true;
ServerProc = new Process();
ServerProc.StartInfo = startInfo;
ServerProc.EnableRaisingEvents = true;
ServerProc.ErrorDataReceived += new DataReceivedEventHandler(ServerProc_ErrorDataReceived);
ServerProc.OutputDataReceived += new DataReceivedEventHandler(ServerProc_OutputDataReceived);
private void ServerProc_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
Dispatcher.Invoke(new Action(() =>
{
ConsoleTextBlock.Text += e.Data + "\r\n";
ConsoleScroll.ScrollToEnd();
}));
}
private void ServerProc_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
Dispatcher.Invoke(new Action(() =>
{
ConsoleTextBlock.Text += e.Data + "\r\n";
ConsoleScroll.ScrollToEnd();
}));
}
Sladkey非同期読み込みと同期読み込みを使用する際の問題は、イベントベースではなく書き込み関数を手動で呼び出す必要があることです。これは正しいです?最高の解決策はタイマーのようなものでしょうか? – shmeeps
プログラムの出力を解析するには、パーサーを書く必要があります。パーザをスレッドとして書くのが最も簡単です。そうしないと、状態マシンが必要になります。出力が確定的であれば、タイマーは一切必要ありません。タスクは簡単なものではなく、ソリューションはユーザーのニーズとアプリケーションによって異なります。設計には解析スレッドとの協調が必要であり、イベントを使用するのが最も簡単かもしれません。それ以外にも、実用的なアプローチがたくさんあります! –