4

一个印地问题。

我在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;
4

1 回答 1

11

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

要使用真正的换行符作为终止符,请改用#10Indy 的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;
于 2013-10-14T23:57:24.063 回答