대기업에서 대기하는 출력을 처리합니다


대기 데이터 처리 대기 출력
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
Process. start : 출력을 얻는 방법?
내 Mono / app에서 외부 명령 줄 프로그램을 실행하고 싶습니다. 예를 들어, mencoder를 실행하고 싶습니다. 가능한가?
커맨드 라인 쉘 출력을 내 텍스트 상자에 써주시겠습니까? 시간 경과와 함께 진행률 표시 줄을 나타내는 수치 값을 얻으려면?
Process 개체를 만들 때 StartInfo를 적절하게 설정합니다.
다음 프로세스를 시작하고 그것에서 읽을 :
int. Parse () 또는 int. TryParse ()를 사용하여 문자열을 숫자 값으로 변환 할 수 있습니다. 읽은 문자열에 유효하지 않은 숫자가있는 경우 먼저 문자열 조작을해야 할 수도 있습니다.
출력을 동 기적 또는 비동기 적으로 처리 할 수 ​​있습니다.
출력과 오류를 모두 처리하는 것이 더 좋습니다. 개별적으로 처리해야합니다.
(*) 일부 명령 (여기서는 StartInfo. Arguments)에 / c 지시문을 추가해야합니다. 그렇지 않으면 WaitForExit ()에 프로세스가 고정됩니다.
출력과 관련하여 복잡한 연산을 수행 할 필요가 없다면 핸들러를 직접 인라인에 추가하기 만하면 OutputHandler 메소드를 무시할 수 있습니다.
이 작업을 수행하는 표준 방법은 Process 'StandardOutput 스트림에서 읽는 것입니다. 연결된 MSDN 문서에는 예제가 있습니다. 마찬가지로 StandardError에서 읽고 StandardInput에 쓸 수 있습니다.
좋아, 오류와 출력을 모두 읽고 싶지만 다른 솔루션 (나와 같은)에서 제공되는 솔루션 중 하나를 사용하여 교착 상태가 발생하는 사람은 StandardOutput 속성에 대한 MSDN 설명을 읽은 다음 솔루션을 작성했습니다.
답은 T30의 코드를 기반으로합니다 :
당신은 2 개의 프로세스가 공유하는 메모리를 사용하여 통신 할 수 있습니다. MemoryMappedFile을 확인하십시오.
당신은 주로 "using"문을 사용하여 부모 프로세스에 mmf 파일을 매핑 한 다음 종료 될 때까지 두 번째 프로세스를 만들고 BinaryWriter를 사용하여 mmf에 결과를 쓰게 한 다음 부모 프로세스를 사용하여 mmf에서 결과를 읽습니다. , 명령 줄 인수를 사용하여 mmf 이름을 전달하거나 하드 코드 할 수도 있습니다.
부모 프로세스에서 매핑 된 파일을 사용할 때 매핑 된 파일이 부모 프로세스에서 해제되기 전에 자식 프로세스에서 매핑 된 파일에 결과를 기록해야합니다.
예 : 상위 프로세스.
이 샘플을 사용하려면 내부에 2 개의 프로젝트가있는 솔루션을 생성 한 다음 % childDir % / bin / debug에서 하위 프로세스의 빌드 결과를 가져 와서 % parentDirectory % / bin / debug에 복사 한 다음 부모 프로젝트
childDir 및 parentDirectory는 PC의 행운을 빌어 프로젝트의 폴더 이름입니다. :)
이것은 mencoder에 의존합니다. 명령 행에서이 상태를 출력하면 yes가됩니다. :)

대기 데이터 처리 대기 출력
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
Exit Wait for Exit가 작동하지 않습니다.
youtube-dl python 스크립트를 사용하여 YouTube에서 다운로드하려면 아래 코드를 사용하고 있습니다.
클라이언트 측 진행률 표시 줄에 표시 할 youtube-dl 스크립트 백분율을 갖고 싶기 때문에이 방법으로 프로세스를 사용했습니다.
그러나 몇 가지 문제가 있으며 WaitForExit이 작동하지 않습니다. 이 문제는 자식 프로세스에서 작동하지 않는 프로세스에서 대기하는 것과 관련된 다른 주제에서 읽습니다. (내 말은 내 뜻은 exit가 python을 youtube-dl 스크립트가 아닌지 기다리는 것입니다)
어떻게해야합니까?
당신이 자식 프로세스에 관심이 있기 때문에 아마 당신은이 메서드를 사용하여 youtube 프로세스를 폴링하려고 시도 할 것입니다 :

대기 데이터 처리 대기 출력
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
C #을 실행하는 동안 프로세스 출력을 얻을.
어쨌든 생성 된 프로세스의 표준 출력을 리디렉션하여 해당 프로세스로 캡처합니다. 내가 본 모든 것은 프로세스가 끝난 후에 ReadToEnd를 수행한다. 출력되는대로 출력하고 싶습니다.
프로세스의 Process. OutputDataReceived 이벤트를 사용하여 필요한 데이터를 수신합니다.
그래서 조금 더 파고 나면 ffmpeg가 stderr를 출력으로 사용한다는 것을 알았습니다. 다음은 출력을 얻기 위해 수정 된 코드입니다.

대기 데이터 처리 대기 출력
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
c # ProcessStartInfo. Start - 출력을 읽지 만 시간 초과가 있습니다.
다른 프로세스를 시작하고 끝내기 위해 대기 (제한 시간이 있음)하려면 MSDN에서 다음을 사용할 수 있습니다.
다른 프로세스를 시작하고 출력을 읽으려면 다음 패턴을 사용할 수 있습니다 (SO에서)
어떻게 두 가지를 결합하여 모든 입력을 읽고, 교착 상태에 빠지지 않고, 실행중인 프로세스가 잘못되면 시간 초과가 발생합니까?
이 기술은 출력 버퍼가 4KB 이상의 데이터로 채워지는 경우 중지됩니다. 더 확실한 방법은 출력 스트림에 무언가가 기록 될 때 알림을받을 대리자를 등록하는 것입니다. 다른 게시물에서 이미이 방법을 제안했습니다.
두 클래스를 결합 할 필요는 없습니다. Process 클래스는 출력이 StandardOutput - OutputDataReceived로 전송 될 때 발생하는 이벤트를가집니다.
이벤트에 가입하면 도착한대로 출력물을 읽을 수있게되며, 메인 프로그램 루프에서 시간 초과를 할 수 있습니다.
첫 번째 메소드를 이와 같이 수정할 수 있습니다.
다음과 같이 APM을 사용할 수도 있습니다.
ReadToEnd 호출에 대한 대리자를 정의합니다.
그런 다음 대리인을 사용하여 다음과 같은 메서드를 호출합니다.
편집 : 오류 처리가 명확하게 제거되었습니다.
WaitForExit () 호출 아래 첫 번째 예제의 모든 것을 두 번째 예제에 추가하기 만하면됩니다.

Comments