■19106 / ) |
Re[4]: Processの標準出力をリアルタイム取得 |
□投稿者/ シャノン (434回)-(2008/05/20(Tue) 12:23:20)
|
■No19103 (れい さん) に返信
> ■No19096 (シャノン さん) に返信
>>これバグくさいなー。
>
> pingの、ですね。
そうなのかな?
コンソールアプリは出力時に \r\n ではなく \n を使うべし、というガイドラインはどこかにあったっけ?
例えばここ
http://www.atmarkit.co.jp/fdotnet/dotnettips/657redirectstdout/redirectstdout.html
では、出力を受ける側で \r\r\n に対応してるけど。
> >>GetDecoderしてDecoder取っておかないと、文字が化けちゃいます。
>>
>>え、そうなの?
>
> OutputEncodingがUTF-16なときに
> 3バイトの読み込みで返ってきたりしたら切れちゃいますよ。
> 必ず偶数まで読む、なんて保証はないですから。
なるほど。勉強勉強。
>>StreamReader を使うというのは良くわからんが。
> StreamReaderに折角「改行まで読む」というメソッドがあるのに使わないのはもったいないというだけです。
あー、ReadLine を非同期で呼べと。
非同期デリゲートは使おうと思わなかったなぁ。
というわけでれいさんのをパクった非同期デリゲート版。
private delegate string ReadLine();
private static void Ping3()
{
using (Process p = new Process())
{
p.StartInfo.FileName = "ping.exe";
p.StartInfo.Arguments = "127.0.0.1";
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.UseShellExecute = false;
p.Start();
for(;;)
{
ReadLine ln = p.StandardOutput.ReadLine;
IAsyncResult ar = ln.BeginInvoke(null, null);
ar.AsyncWaitHandle.WaitOne();
string line = ln.EndInvoke(ar);
if (line == null)
{
break;
}
Console.WriteLine(line);
}
}
Console.WriteLine();
Console.WriteLine("Complete");
}
やっぱり改行が \r\r\n になるおまけつき。
|
|