2013-10-14 53 views
4

Indy問題。Delphi Indy ReadLn超時

我添加了一個超時參數給我的TIdTCPClientReadLn調用,所以我的線程可以經常檢查終止。但是,如果超時發生,我從此從未從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; 

回答

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; 
+0

謝謝,這是個很愚蠢的,我是從拷貝我的Python側成\ n。 – runfastman