gpt4 book ai didi

Delphi Indy ReadLn 超时

转载 作者:行者123 更新时间:2023-12-03 15:19:06 27 4
gpt4 key购买 nike

印地问题。

我在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com