0

問題

外部プロセスがテキストを出力するという問題がありますが、私の C# アプリケーションはそれをキャッチできません。外部プロセスは永久に実行され続け、時々テキストを出力します。

次のコードは部分的に機能します...コンソールは開きますが、プロセスがデータを出力していると思っても、コンソール ウィンドウを手動で閉じるまで何も起こりません。その時点で、コンソール ウィンドウに、外部プロセスが何を言わなければならなかったかが出力されます。

私の Visual C# フォームは、次のコードを実行します。

Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = "MyFile.exe";
p.StartInfo.Arguments = "arguments";
p.StartInfo.RedirectStandardInput = false;
p.StartInfo.RedirectStandardOutput = false;
p.StartInfo.RedirectStandardError = false;
p.StartInfo.CreateNoWindow = false;
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

p.OutputDataReceived += new DataReceivedEventHandler( pOutputHandler );
p.ErrorDataReceived += new DataReceivedEventHandler( pOutputHandler );

started = p.Start();

//p.BeginOutputReadLine();
//p.BeginErrorReadLine();

private void pOutputHandler( object sendingProcess, DataReceivedEventArgs outLine )
{
    Console.writeLine( outLine.data + Environment.NewLine;
}

私が試したこと

  • RedirectStandardInput, RedirectStandardOutput, RedirectStandardErrorandCreateNoWindowを trueに設定してBeginOutputReadLineandのBeginErrorReadLine行のコメントを外すと、まったく何も起こっていないように見えます。
  • 外部プロセスを変更して、文字列を出力し、終了するようにしました。その場合、私のコード (リダイレクトとコメントなし) は正常に動作しているように見えました。

予測?

外部プロセスが実際には実行されておらず、スタックしている可能性はありますか? では、コンソール ウィンドウを閉じるまでスタックしたままになるのはなぜですか?

追加情報

さらにテストを重ねているうちに、この問題は外部プロセスに起因するのではないかと考え始めています。次のプロセスを C++ で記述しました。

int main()
{
    int x = 0;
    while( x < 100 )
    {
        Sleep( 100 );
        x = x + 1;
        cout << "Testing 123! " << x << "\r";
    }
    return 1;
}

このプロセスを C# アプリケーションで外部プロセスとして使用しているときに、プロセスが完了して終了した瞬間に、出力がハンドラーにキャッチされます。非同期コールバックがプロセスの終了後にのみ出力をキャッチするのはどうしてでしょうか? それが起こらないようにして、出力を「ライブ」でキャッチするにはどうすればよいですか?

4

1 に答える 1

0

ソリューション

C++ のドキュメントを調べたところ、「出力バッファーのフラッシュ」というトピックに出会いました。

外部プロセスで私がしなければならなかった唯一のことは、出力されたテキストをすぐに送信したいときはいつでも、次のコード行を追加することでした:

cout << "Some string" << someVar;
cout << flush;
于 2013-05-07T16:47:47.543 に答える