2009-03-09 14 views
1

Süreç sınıfını kullanarak bir konsol uygulaması oluşturduğum bir GUI uygulamasına sahibim. Kısmen C# uygulamasından oluşturulan başka bir işlemin standart çıktısını kısmen okuyor

Process p1 = new Process(); 
p1.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
p1.StartInfo.CreateNoWindow = true; 
p1.StartInfo.UseShellExecute = false; 
p1.StartInfo.FileName = Path.Combine(basepath, "abc.exe"); 
p1.StartInfo.Arguments = "/pn abc.exe /f \"temp1.txt\""; 
p1.StartInfo.RedirectStandardError = true; 
p1.StartInfo.RedirectStandardInput = true; 
p1.StartInfo.RedirectStandardOutput = true; 
p1.OutputDataReceived += new DataReceivedEventHandler(outputreceived); 
p1.ErrorDataReceived += new DataReceivedEventHandler(errorreceived); 
p1.Start(); 
tocmd = p1.StandardInput; 
p1.BeginOutputReadLine(); 
p1.BeginErrorReadLine(); 

Şimdi ben o zaman uyumsuz konsol çıktısını okur da, bir sorun var ama iç tampon bazı miktarı ile doldurulur sadece olayı gibi görünüyor. Verileri geldiğinde görüntülemek istiyorum. Tamponda 10 bayt varsa, 10 bayt göstermesine izin verin. Programım dahili olarak sleep() çağrısını uygular, böylece uykuya kadar veriyi yazdırmam gerekir.

Nasıl yapabilirim? çıkış hattı tamponlanır de belirtildiği gibi

=============

, kod

p1.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
p1.StartInfo.CreateNoWindow = true; 
p1.StartInfo.UseShellExecute = false; 
p1.StartInfo.FileName = Path.Combine(basepath, "abc.exe"); 
p1.StartInfo.Arguments = pnswitch + " /f \"temp1.txt\""; 
p1.StartInfo.RedirectStandardError = false; 
p1.StartInfo.RedirectStandardInput = true; 
p1.StartInfo.RedirectStandardOutput = true; 
p1.Start(); 
tocmd = p1.StandardInput; 
MethodInvoker mi = new MethodInvoker(readout); 
mi.BeginInvoke(null, p1); 

ve okuma içinde aşağıdaki değişiklik çalıştı ı yazdı

void readout() 
    { 
     string str; 
     while ((str = p1.StandardOutput.ReadLine()) != null) 
     { 
      richTextBox1.Invoke(new UpdateOutputCallback(this.updateoutput), new object[] { str }); 
      p1.StandardOutput.BaseStream.Flush(); 
     } 
    } 

Yani ben her satırı yazıldığında şimdi izler düşünmek ve bunu doğru yazdırır? Bu da işe yaramadı. Orada bir şey var mı?

cevap

3

Alınan Çıkış ve Hata Verileri satır tamponludur ve yalnızca yeni satır eklendiğinde tetiklenir.

En iyi seçiminiz, girişi bayt olarak okuyabilen kendi okuyucunuzu kullanmaktır. Obvioulsly, bu bloke edici olmamalıdır :)

+0

ben kendi okuyucusunu yapma konusunda nasıl gidebiliriz gibi herhangi bir fikir mi? Stdoutput akışını izleyen ve bazı verileri olduğunda her zaman okuyan bir işlev yazamaz mıyım? –

+0

Evet, bu fikir. StandardOutput'ı başka bir iş parçacığından okursunuz. – leppie

+0

Kodu değiştirdim ve satır okumayı tamamladım. bir göz atabilir misin? –

1

Bunu başarmak için, yönlendirilmiş bir akış üzerinde senkronize okuma işlemleri kullanmalısınız. Kodunuz bu (MSDN örnek) gibi görünecektir:

// Start the child process. 
Process p = new Process(); 
// Redirect the output stream of the child process. 
p.StartInfo.UseShellExecute = false; 
p.StartInfo.RedirectStandardOutput = true; 
p.StartInfo.FileName = "Write500Lines.exe"; 
p.Start(); 
// Do not wait for the child process to exit before 
// reading to the end of its redirected stream. 
// p.WaitForExit(); 
// Read the output stream first and then wait. 
**string output = p.StandardOutput.ReadToEnd();** 
p.WaitForExit(); 

bazı konuları kullanması gerekir zaman uyumsuz davranış elde etmek amacıyla.

MSDN Madde here

+0

Bir async çağrısı yaptım. Güncellenmiş soruya ve yorumunuza bir göz atabilir misiniz? –

İlgili konular