Delphi Indy带超时的ReadLn

4
一个Indy问题。
我给我的TIdTCPClientReadLn调用添加了一个超时参数,以便我的线程能够定期检查是否终止。然而,如果超时发生,从那时起我就再也没有从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个回答

12

与C/C++不同,\在Delphi中不是转义字符,因此'\n'不会被解释为换行符。 它是一个实际的两个字符的字符串,一个是'\'字符,另一个是'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;

谢谢,那是一个愚蠢的错误,我从我的 Python 代码中复制了 \n。 - runfastman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接