Delphi Indy ReadLn超时

run*_*man 4 delphi indy

一个印第安人的问题.

我为我的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;
Run Code Online (Sandbox Code Playgroud)

Rem*_*eau 11

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

要使用实线换行作为终结符,请使用#10或Indy的LF常量:

msg := fSocketCon.IOHandler.ReadLn(#10, 200);
Run Code Online (Sandbox Code Playgroud)

msg := fSocketCon.IOHandler.ReadLn(LF, 200);
Run Code Online (Sandbox Code Playgroud)

或者,使用空字符串,告诉ReadLn()它使用其默认LF终止符:

msg := fSocketCon.IOHandler.ReadLn('', 200);
Run Code Online (Sandbox Code Playgroud)

或者,根本不要使用ATimeout参数.请改用ReadTimeout属性,然后不指定终结符,以便使用默认LF终止符:

fSocketCon.IOHandler.ReadTimeout := 200;
...
msg := fSocketCon.IOHandler.ReadLn;
Run Code Online (Sandbox Code Playgroud)