我試圖編寫一個由另一個程序作爲進程啓動的Pascal(Lazarus/FPC)程序。調用者(Arena chess GUI)使用StdIn和StdOut與我的程序對話。Pascal 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上有非阻塞的輸入?