【问题标题】:Delphi Indy ReadLn with timeoutDelphi Indy ReadLn 超时
【发布时间】:2013-10-14 23:43:09
【问题描述】:

一个印地问题。

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

【问题讨论】:

    标签: delphi indy


    【解决方案1】:

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

    【讨论】:

    • 谢谢,那是个笨蛋,我是从 Python 端复制 \n 的。
    猜你喜欢
    • 2013-10-19
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 2019-01-17
    • 2022-01-05
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多