2011-11-15 139 views
4

我正在排除Delphi 7 Indy9輪詢客戶端的故障。我曾嘗試添加一個帶有waitforsingleobject的Tevent和許多其他方式來優雅地斷開連接。錯誤發生在readln中。錯誤通常是'EIDConnection ...未連接'。我已經把它看了一遍,線程終止。但'while'不會重新評估條件,直到連接從服務器接收到一個msg,所以它只會在readln上磨合,直到收到msg。所以有時它會優雅地斷開連接,但大多數時候會崩潰。有沒有辦法做到這一點還是我只是把一個嘗試...除了圍繞readln並進行...在此先感謝優雅地關閉客戶端線程

procedure TReadingThread.Execute; 
begin 
    while not Terminated and FConn.Connected do 
    begin 
     // read msg from server 
     Msg := FConn.ReadLn; 
     Synchronize(ReceiveLine); 
    end; 
end; 
+2

實際問題是什麼?如果連接被關閉,'ReadLn()'被設想*引發異常。取消對「Connected()」的調用並讓「ReadLn()」完成其工作。如果讓異常終止線程(這將是正確的事情),'while'不應該保持運行,因爲異常跳出循環。所以我不明白你到底有什麼問題。 –

回答

0

我想你需要添加一些代碼來處理事件斷開。我有一個類似的問題,以你的描述,這裏就是我所做的(在這個例子中,TCPSERVER是TIdTCPServer的一個實例):

procedure TformRemoteControlWnd.tcpServerDisconnect(AContext: TIdContext); 
    (* 
    Connection is disconnected. Be careful, because this also gets called when 
    the app is shutting down while a connection is active, in which case 
    tcpServer may be gone already. 
    *) 
    begin 
     if not Application.Terminated and Assigned(tcpServer) then 
     begin 
     sbarStatus.SimpleText := 'TCP/IP Disconnected'; 
     tcpServer.Tag := 0; // used to prevent rentrancy 
     end; 

     // shut down connection to stop thread from calling OnExecute event 
     try 
     AContext.Connection.Disconnect; 
     except 
     Sleep(0); 
     end; 
    end; 
+0

一旦爲連接觸發'OnDisconnect'事件,則不會爲該連接再次觸發'OnExecute'事件。一旦'OnDisconnect'處理程序退出,連接將被關閉。在OnDisconnect事件處理程序中不需要調用Disconnect()。 –

+0

雷米 - 謝謝,我試了一下。這是一段時間以前,但我似乎記得有一個原因,我必須把Disconnect()調用放在那裏。 – ByteArts

0

我已經找到了答案...... Readln將無限期地等待,直到它接收回車。因此,線程位於Readln,直到服務器發送消息或套接字斷開(導致崩潰)。在Delphi編譯器代碼中,在OnDisconnect中寫了一條評論,以便使用try...except來捕獲錯誤。所以我只需要在斷開插座之前小心清理。我想我可以找到一個更清潔的關閉方法。感謝所有的幫助。