21

プロセス(lame.exe)を実行して、WAVファイルをMP3にエンコードします。

プロセスのSTDOUTとSTDERRを処理して、進捗情報を表示したい。

スレッドを使用する必要がありますか?頭が回らない。

いくつかの簡単なサンプルコードをいただければ幸いです。

ありがとう

4

3 に答える 3

7

クラスを介して実行している場合Processは、ストリームをリダイレクトして処理できるようにすることができます。stdoutまたはstderrから同期的または非同期的に読み取ることができます。trueリダイレクトを有効にするには、リダイレクトするストリーム(たとえば)に適切なリダイレクトプロパティをに設定しRedirectStandardOutput、に設定UseShellExecutefalseます。次に、プロセスを開始してストリームから読み取ることができます。入力リダイレクトstdinをフィードすることもできます。

たとえば、プロセスがstdoutに同期的に書き込むものはすべて処理して印刷します

var proc = new Process()
{
    StartInfo = new ProcessStartInfo(@"SomeProcess.exe")
    {
        RedirectStandardOutput = true,
        UseShellExecute = false,
    }
};
if (!proc.Start())
{
    // handle error
}
var stdout = proc.StandardOutput;
string line;
while ((line = stdout.ReadLine()) != null)
{
    // process and print
    Process(line);
    Console.WriteLine(line);
}
于 2010-11-06T06:10:15.983 に答える
6

このためのMSDNの例があります...これは簡略化されたバージョンです:

var StdOut = "";
var StdErr = "";

var stdout = new StringBuilder();
var stderr = new StringBuilder();

var psi = new ProcessStartInfo();
psi.FileName = @"something.exe";
psi.CreateNoWindow = true;
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.RedirectStandardError = true;

var proc = new Process();
proc.StartInfo = psi;
proc.OutputDataReceived += (sender, e) => { stdout.AppendLine(e.Data); };
proc.ErrorDataReceived += (sender, e) => { stderr.AppendLine(e.Data); };
proc.Start();
proc.BeginOutputReadLine();
proc.BeginErrorReadLine();
proc.WaitForExit(10000); // per sachin-joseph's comment

StdOut = stdout.ToString();
StdErr = stderr.ToString();
于 2017-08-15T23:11:15.753 に答える
5

Process.OutputDataReceivedイベントでSTDOUTを聞くことができるはずです。MSDNページに例があります。Process.ErrorDataReceivedSTDERRのイベントもあります。

于 2010-11-06T06:26:52.850 に答える