Delphi Indy ReadLn超时

时间:2013-10-14 23:43:09

标签: delphi indy

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;

1 个答案:

答案 0 :(得分:11)

与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;