【发布时间】:2015-10-01 04:00:15
【问题描述】:
我正在尝试编写一个由另一个程序作为进程启动的 Pascal (Lazarus/FPC) 程序。调用者(Arena chess GUI)使用 StdIn 和 StdOut 与我的程序对话。
首先,我在我的程序中使用 READLN 来获取从 GUI 发送的文本命令,并使用 WRITELN 来回复它们。效果很好,只是如果 READLN 必须等待来自 GUI 的输入,我的程序将停止执行任何操作。因为我希望程序继续工作并且只在命令到达时处理它们,所以我不得不改变它。
所以我改变了使用的代码:
...
var inpStream : TInputPipeStream;
...
inpStream := TInputPipeStream.Create(StdInputHandle);
...
if inpStream.NumBytesAvailable > 0 then begin
SetLength(s_buffer, inpStream.NumBytesAvailable);
inpStream.Read(s_buffer[1], length(s_buffer));
end;
...
效果非常好,因为它不再暂停阅读。但随后 WRITELN 停止工作:没有任何内容被发送回 GUI。我想也许这会有所帮助:
...
var inpStream : TInputPipeStream;
outStream : TOutputPipeStream;
...
inpStream := TInputPipeStream.Create(StdInputHandle);
outStream := TOutputPipeStream.Create(StdOutputHandle);
...
if inpStream.NumBytesAvailable > 0 then begin
SetLength(s_buffer, inpStream.NumBytesAvailable);
inpStream.Read(s_buffer[1], length(s_buffer));
end;
...
outStream.Write(s_buffer, length(s_buffer));
但这使情况变得更糟,因为它现在不读取或写入任何内容。那么如何在保持写入 StdOut 的能力的同时在 StdIn 上进行非阻塞输入?
【问题讨论】: