一个印地问题。
我在 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/