gpt4 book ai didi

c++ - TProcess - 从多个 Process.Input.Write(...) 命令捕获输出

转载 作者:行者123 更新时间:2023-11-28 07:17:07 24 4
gpt4 key购买 nike

我想让国际象棋引擎分析一些 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;

最佳答案

Afaik 不可能以跨平台方式等待 TProcess 的输出。管道上的读取可能会阻塞,直到收到指定的字节。

可能可以通过在流句柄(操作系统句柄)上使用 (baseunix.fp)select 或 (windows.)waitforsingleobject 来解决这个问题。

我不知道执行此操作的任何代码,但我认为 Lazarus 中的调试器代码是使用代码(调用 GDB)的最复杂的 TProcess,因此我建议研究一下。

关于c++ - TProcess - 从多个 Process.Input.Write(...) 命令捕获输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20054546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com