2011-11-15 4 views
4

Delphi 7 Indy9 폴링 클라이언트 문제를 해결하고 있습니다. 나는 waitforsingleobject으로 TEvent를 추가하려고 시도했고 우아하게 연결을 끊는 다른 많은 방법을 시도했다. readln에서 오류가 발생합니다. 일반적으로 오류는 'EIDConnection ... not connected'입니다. 나는 그것에 시계를 달았고 쓰레드는 끝났다. 'while'은 연결이 서버에서 msg를 수신 할 때까지 조건을 재평가하지 않으므로 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

사전에 ... 덕분 readln 주위를 제외하고 ...해볼 넣고에서 수행 할 수있는 방법이 있나요 .

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 무기한 대기를 발견 : 나는 당신이 설명하는 것과 비슷한 문제가 있고, 여기에 내가 무슨 짓을했는지 (이 예에서는, tcpserver는이 TIdTCPServer의 인스턴스) 캐리지 리턴. 그래서 쓰레드는 서버가 메시지를 보내거나 소켓이 연결 해제 될 때까지 (충돌을 일으킴) Readln에 앉는다. 델파이 컴파일러 코드에서 OnDisconnect에 설명문을 작성하여 try...except을 사용하여 오류를 잡았습니다. 그래서 나는 소켓을 분리하기 전에 청소하는 것을 조심할 필요가 있습니다. 클리너 클로즈 방법을 찾을 수있을 거라 생각 했어. 모든 도움에 감사드립니다.

관련 문제