2012-09-24 18 views
1

Im 인간 대 컴퓨터 게임에 전원을 공급하기 위해 Stockfish 게임 엔진을 사용하고 있습니다. 모든 것이 괜찮다는이 시점에서Reading StandardInput은 응용 프로그램을 중단하지 않고 코드 실행을 중지합니다.

Process _proc= new Process(); 
_proc.StartInfo = new ProcessStartInfo(path); 
_proc.StartInfo.RedirectStandardInput = true; 
_proc.StartInfo.RedirectStandardOutput = true; 
_proc.StartInfo.UseShellExecute = false; 
_proc.StartInfo.CreateNoWindow = true; 
_proc.Start(); 
_proc.StandardInput.WriteLine("uci"); 
_proc.StandardInput.WriteLine("ucinewgame"); 

,하지만 난 읽으려고 할 때 이상한 StandardOutput 뭔가 상황이 발생합니다 다음은 코드의 첫 번째 부분입니다.

string result = _proc.StandardOutput.ReadToEnd(); 

Stockfish.exe 프로그램이 내 응용 프로그램이 실행 중이지만 해당 줄 다음의 코드가 실행되지 않습니다. 내가 일시 정지를 누르면,이 라인에 포인트 :

enter image description here

내가 사용하는 경우 :

while (!_proc.StandardOutput.EndOfStream) 
{ 
    result += _proc.StandardOutput.ReadLine(); 
} 

같은 일 만 문 동안에서 발생합니다. 결과에는 거기에 전체 가치가있다, 모든 텍스트가 그것에 기록됩니다.

비동기 읽기없이이를 극복 할 수있는 방법이 있습니까?

사이드 문제 :이 이후

은 내가 (잠금 포함) 보호 할 수있는 방법 임 확실하지 때문에 비동기 읽기를 사용하여 같은 느낌 해달라고, 전체 ASP.NET 응용 프로그램을 통해 사용되는 싱글 톤 클래스의 모든 부분에 여러 그것에 쓰는 쓰레드. 또한, 명령 처리가 10 초까지 지속될 수 있기 때문에 현재 스레드를 중지하는 방법을 모른다.

나는 Thread.Sleep()을 사용하여 끊임없이 출력의 끝을 확인하고 우아하지는 않은지 생각하지 않습니다.

사이드 문제를 고려할 때 비동기가 유일한 해결책 인 경우 어떻게 멀티 스레드 문제를 피할 수 있습니까?

내 스레딩 지식이 약하기 때문에 스레드 관련 답변을 제공 할 때 명심하십시오. 고맙습니다.

답변

0

StandardOutput.ReadToEnd에 대한 호출은이 프로세스가 끝날 때까지 차단됩니다. 당신이 그것을받는 과정에서 나오는 다양한 텍스트 명령을 읽고, 처리하고, 응답하는 것이 여기의 목표입니까?
비동기 읽기를 통해이 문제에 접근해야합니다.

예를 들어 수신기를 Process.OutputDataReceived으로 설정할 수 있습니다. 그런 다음 Process.BeginOutputReadLine으로 전화하여 읽기를 시작하십시오. 코드가 계속 실행됩니다. 한편 .NET Framework는 별도의 스레드에서받는 텍스트 메시지를 처리합니다.

+0

문제는 내가 ReadLine()을 사용할 때 선이있는 한 작동한다는 것입니다. 엔진이 반환 한 텍스트가 더 이상 없을 때 사용하면 그림과 같이 끊어집니다. 최악의 경우는 얼마나 많은 줄이 있는지 모르고 길이를 얻거나 데이터의 끝을 감지 할 길이 없습니다. 비동기 aproach를 사용했는데 제대로 동작하지만 프로그램이 "dead lock"을 입력하지 않지만 다음과 같은 다른 문제가 발생합니다. 프로그램이 계속되지만 엔진이 모든 데이터를 반환하지 않습니다. –

관련 문제