我希望国际象棋引擎以pgn格式分析一些游戏。
到现在为止。
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;
答案 0 :(得分:1)
Afaik无法以跨平台的方式等待TProcess的输出。管道上的读取可能会阻塞,直到收到指定的字节为止。
可能通过在流的句柄(即OS句柄)上使用(baseunix.fp)select或(windows。)waitforsingleobject来解决此问题。
我不知道任何代码可以做到这一点,但我认为Lazarus中的调试器代码是使用代码(调用GDB)的最复杂的TProcess,所以我建议调查一下。