2013-11-18 5 views
0

Я хочу, чтобы шахматный движок анализировал некоторую игру в формате pgn.TProcess - Захват вывода из нескольких команд Process.Input.Write (...)

До сих пор у меня есть.

begin 
// ... 
P:=TProcess.Create(nil); 
stL:=TStringList.create; 
P.Commandline:='Houdini'; // <- this is chess engine, Houdini.exe 
P.Options:=P.Options+[poUsePipes]; 
P.ShowWindow:=swoHide; 
P.Execute; 

st:='uci'+ Lineending; 
P.Input.Write(st[1], Length(st)); 
// st:=P.Output.ReadAnsiString; <- this is my try 
// showmessage(st); 
st:='setoption name multipv value 3'+lineending; 
P.Input.Write(st[1], Length(st)); // so after second command how to catch different output 
st:='isready'+lineending; 
P.Input.Write(st[1], Length(st)); 
st:='ucinewgame'+lineending; 
P.Input.Write(st[1], Length(st)); 
st:='isready'+lineending; 
P.Input.Write(st[1], Length(st)); 

// another part of code should be here *** 

st:='quit'+lineending; 
P.Input.Write(st[1], Length(st)); // quiting the engine 
stL.LoadFromStream(P.Output); 
stL.SaveToFile('AjDaVidime.txt'); // nothing stores particular 

P.Free; 
stL.Free; 
end; 

Так вопрос в том, как получить выход из мощности двигателя после каждого P.Input.Write ...

Другая часть кода следующим образом (это за странное поведение StackOverflow, чтобы опубликовать свой вопрос. Это код должен быть в первой в *

// This for loop is main loop for analyzing chess game 
for i:=1 to moves do begin 
st:='position fen '+arrayFen[i]+lineending; 
P.Input.Write(st[1], Length(st)); 
st:='go movetime 1000'+lineending; // Fen is position 1000ms is 1sec, so engine Must analyze 1 sec. that position, so go movetime 1000 is command. 
P.Input.Write(st[1], Length(st)); 
Sleep(1000); // <- is this neccessary? 
end; 

ответ

1

AFAIK это не возможно ждать выхода с TProcess в кроссплатформенной манере. Считывание на трубе может блокировать до указанной конечной байты приемников редактор

Возможно, это можно обойти это, используя (baseunix.fp) select или (windows.) Waitforsingleobject в дескрипторе потока (который является дескриптором ОС).

Я не знаю никакого кода, который делает это, но я думаю, что код отладчика в Lazarus является самым сложным TProcess с использованием кода (вызов GDB), поэтому я предлагаю изучить это.

Смежные вопросы