一个印第安人的问题.
我为我的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;
Run Code Online (Sandbox Code Playgroud)
Rem*_*eau 11
与C/C++不同,\它不是转义字符,因此'\n'在Delphi中不被解释为换行符.它是一个实际的2个字符的字符串,'\'后跟一个'n'字符的字符.
要使用实线换行作为终结符,请使用#10或Indy的LF常量:
msg := fSocketCon.IOHandler.ReadLn(#10, 200);
Run Code Online (Sandbox Code Playgroud)
msg := fSocketCon.IOHandler.ReadLn(LF, 200);
Run Code Online (Sandbox Code Playgroud)
或者,使用空字符串,告诉ReadLn()它使用其默认LF终止符:
msg := fSocketCon.IOHandler.ReadLn('', 200);
Run Code Online (Sandbox Code Playgroud)
或者,根本不要使用ATimeout参数.请改用ReadTimeout属性,然后不指定终结符,以便使用默认LF终止符:
fSocketCon.IOHandler.ReadTimeout := 200;
...
msg := fSocketCon.IOHandler.ReadLn;
Run Code Online (Sandbox Code Playgroud)