Delphi Indy ReadLn 超时

标签 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;

最佳答案

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

关于Delphi Indy ReadLn 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19371049/

相关文章:

Delphi firemonkey进程间通信有可能吗?

delphi - Rad Studio XE4和Delphi XE4

delphi - 使用 Fastmm4 什么时候会出现虚拟内存问题?

delphi - 使用 TIdSmtp.Connect() 方法发生错误 11004 时获取扩展错误信息?

delphi - 如何检测服务器是否使用 TIdTCPClient 响应请求?

delphi - 由于 jcl 要求,jcvl 无法工作

delphi - 当 TListView 中的所选项目发生更改时(之前)如何响应?

delphi - 从 TIdHttp 获取响应,错误代码为 400

delphi - TidHttp 文件下载引发内存不足异常

delphi - 如何使用 Indy10 中的 TIdThreadSafe 类