一个印地问题。

我在 TIdTCPClient ReadLn 调用中添加了一个超时参数,以便我的线程可以经常检查是否终止。但是,如果发生超时,从那时起我就再也没有从 ReadLn 中获得任何数据。如何重置 TIdTCPClient 以便它再次查找一行?

procedure TClientListner.Execute;
var
  msg : String;

begin

  while not terminated do
  begin
    msg := fSocketCon.IOHandler.ReadLn('\n', 200);
    if not fSocketCon.IOHandler.ReadLnTimedOut then
    begin
      DoSomeThing(msg);
    end;
  end;
end;

最佳答案

与 C/C++ 不同,\ 不是转义字符,因此 '\n' 在 Delphi 中不被解释为换行符。它是一个实际的 2 个字符的字符串,一个 '\' 字符后跟一个 'n' 字符。

要使用真正的换行符作为终止符,请改用 #10 或 Indy 的 LF 常量:

msg := fSocketCon.IOHandler.ReadLn(#10, 200);
msg := fSocketCon.IOHandler.ReadLn(LF, 200);

或者,使用一个空白字符串,它告诉 ReadLn() 使用其默认的 LF 终止符:
msg := fSocketCon.IOHandler.ReadLn('', 200);

或者,根本不使用 ATimeout 参数。改用 ReadTimeout 属性,然后不指定终止符,因此使用默认的 LF 终止符:
fSocketCon.IOHandler.ReadTimeout := 200;
...
msg := fSocketCon.IOHandler.ReadLn;

关于Delphi Indy ReadLn 超时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19371049/

10-11 17:44