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;
答案 0 :(得分:11)
与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;