2012-04-27 2 views
2

Perl 스크립트를 실행하고 표준 출력을 읽고 사용하는 VB .NET 프로그램을 작성하려고합니다. 인쇄 된대로 각 줄을 개별적으로 처리하고 이에 따라 프로그램을 업데이트 할 수 있기를 바랍니다. 저는 여기에 "작성"몇몇 코드입니다 (읽기 : "주로 인터넷을 복사") :어떻게하면 보조 프로세스의 출력을 실시간으로 처리 할 수 ​​있습니까?

Private WithEvents pscript As Process 

Private Sub myProgram_Load(sender As Object, e As System.EventArgs) Handles Me.Load 
    pscript = New Process() 
    pscript.StartInfo.CreateNoWindow = True 
    pscript.StartInfo.FileName = "C:\perl64\bin\perl.exe" 
    pscript.StartInfo.Arguments = "C:\test.pl" 
    pscript.StartInfo.UseShellExecute = False 
    pscript.StartInfo.RedirectStandardOutput = True 
    pscript.StartInfo.RedirectStandardInput = True 
    AddHandler pscript.OutputDataReceived, AddressOf pscript_output_process 
    pscript.Start() 
    pscript.BeginOutputReadLine() 
End Sub 

Private Sub pscript_output_process(sender As Object, e As DataReceivedEventArgs) 
    MessageBox.Show(e.Data) 
End Sub 

을이 하나의 문제와 함께 작동 : 테스트 스크립트가 실행을 완료 할 때까지 프로그램이 대기하고 여러 화재 OutputDataReceived 이벤트가 차례로 발생합니다. 즉, 실제 스크립트를 사용하게되면 몇 시간 만에 아무 것도하지 않으면서도 상당히 정기적 인 간격으로 물건을 인쇄 했음에도 불구하고 한 번에 5,000 개의 이벤트를 처리해야합니다. 그 시간 내내.

마지막에 한 번에 모든 내용을 쓰지 않고 각 줄을 처리 할 수있는 방법이 있습니까?

+0

리다이렉트 stdout. – dubvfan87

+0

아마도 여기에 없지만 도움말 문서에 "비동기 출력을 처리하는 응용 프로그램이 출력 버퍼가 플러시되었는지 확인하기 위해 WaitForExit 메서드를 호출해야합니다." –

+0

Jim : WaitForExit 호출로 인해 스크립트가 완료 될 때까지 완전히 고정시키고, 그렇지 않으면 같은 방식으로 작동합니다. – gorcq

답변

0
While (pscript.HasExited = False) 
    Dim sLine As String = pscript.StandardOutput.ReadLine 
End While 
+0

어떤 이유로 인쇄 된 첫 번째 줄만 잡아서 스크립트가 완료 될 때까지 기다립니다. 또한 스크립트가 실행되는 동안 내 프로그램이 정지되어 이벤트 기반 메소드 (작동하는 경우)가 마음에 들었습니다. – gorcq

1

인터넷에서 더 많은 내용을 복사하여 문제를 해결하는 방법을 알아 냈습니다. 이 문제는 Perl에서 있었던 것으로 보입니다. Perl은 각 print 문 다음에 표준 출력을 플러시하지 않습니다. 나는 그 마지막 문장이 의미하는 것이 무엇인지는 정말로 모르지만, 어쨌든, 스크립트 상단에 local $| = 1; 줄을 추가하면 (내가 읽은 사이트에 따라 자동으로 표준 출력을 플러시하게 함) 문제를 해결합니다.

+0

"Flush standard output"은 약간의 부주의 한 설명입니다. 그것은 "STDOUT을 위해 버퍼 플러시"라고 말해야합니다. 효율성을 위해 기본적으로 빠른 RAM 버퍼가 사용됩니다. 버퍼가 가득 차거나 수동으로 비울 때 ("flushed")에만 데이터가 스트림 (파일, 터미널, 소켓)에 저장됩니다. ['$ |'] (http://p3rl.org/var#%24%7c)를 설정하면 버퍼링이 해제됩니다. (제 설명은 약간 정확하지 않지만, 요지는 사실이며, 세부 사항을 언급 할만큼 충분한 공간이 아닙니다.) [Buffering from Suffering from Buffering?] (http://perl.plover.com/FAQs/Buffering.html)을 읽어보십시오. 확장 토론. – daxim

+0

기사를 가져 주셔서 감사합니다. 이것은 지금 훨씬 더 의미가 있습니다. – gorcq

관련 문제