0

プロセス「python.exe」を起動するコードがいくつかあります。process.StartInfo.RedirectStandardInput=false を設定すると、リダイレクトされた出力はプロセスからストリームを返します。出力は利用可能で、readOut() または readErr() スレッド ハンドラによって処理されます。ただし、true に設定すると、プロセスからの出力は得られません。Windows フォームからプロセスに入力を送信できるように、入力リダイレクトが必要です。

私は2つのスレッドを持っています.1つはリダイレクトされた出力を処理し、もう1つはリダイレクトされたstderrorを処理します。いくつかの指針を提供していただければ幸いです。ありがとうございました。

私のコードは次のようになります。

        ....
        Process p = new Process();
        p.StartInfo.WorkingDirectory = "C:\\";
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.CreateNoWindow = true;
        p.StartInfo.RedirectStandardOutput = true;

        //output is available and processed by readErr if this set to false.
        p.StartInfo.RedirectStandardInput = true;

        p.StartInfo.RedirectStandardError = true;
        p.EnableRaisingEvents = true;
        p.StartInfo.FileName = this.exe;

        readTh = new Thread(readOut);
        readTh.Name = "CmdStdOutTh";
        errTh = new Thread(readErr);
        errTh.Name = "CmdStdErrTh";

        lock (this)
        {
            p.Start();
            readTh.Start();
            errTh.Start();
        }
    ....

    void readOut()
    {
        char[] buf = new char[256];
        int n = 0;
        while ((!p.HasExited || (p.StandardOutput.Peek() >= 0)) && !abort) {
            n = p.StandardOutput.Read(buf, 0, buf.Length - 1);
            buf[n] = '\0';
            if (n > 0)
                processOutput(new string(buf));
            Thread.Sleep(0);
        }
    }

    void readErr() {
        char[] buf = new char[256];
        while ((!p.HasExited || (p.StandardError.Peek() >= 0)) && !abort) {
            int n = p.StandardError.Read(buf, 0, buf.Length - 1);
            buf[n] = '\0';
            if (n > 0)
                processError(new string(buf));
            Thread.Sleep(0);
        }
    }           
4

2 に答える 2

0

私は問題を理解しました。「p.StartInfo.RedirectStandardInput = true」は正しく機能しています。問題は Python.exe にあります。StartInfo.Arguments には "-i" arg オプションを使用する必要があります。で説明されています

Python の標準入出力を C# フォーム アプリケーションにリダイレクトする

于 2013-06-19T18:57:19.160 に答える
0

を使用して、 p が完了するまで必ず待機してください

p.WaitForExit();

それはあなたの例には欠けているようです。私が知る限り、残りは正しいと言えますが、おそらくもっとうまく書くことができます: 書かれているように、利用可能な出力がない場合、コードはスピンして待っているように見えます. それはCPUを不必要に燃やします。代わりに、先に進んで Read を呼び出してください。十分になるまでブロックするため、他のスレッドまたはプロセスのために CPU が解放されます。

于 2013-06-18T01:33:09.550 に答える