2012-06-14 6 views
0

Indy 9 구성 요소를 사용하여 외부 장치와의 지속적인 IdTCPConnection을 유지 관리하는 Delphi 6 응용 프로그램이 있습니다. 어떤 때는 연결을 끊은 다음 장치에 다시 연결하려고합니다. Indy가 3 가지 예외를 버리는 것을 발견했을 때. Indy 구성 요소가 백그라운드 스레드에 있고 Execute() 루프 스레드를 중단하고 싶지 않기 때문에 다소 재밌는 재 연결 전략을 개발하게되었습니다.Indy가 소켓을 닫을 때 여러 예외를 throw합니다. 깨끗한 자동 재접속을 수행하는 방법?

다시 연결하기 전에 3 가지 예외를 흡수하는 좋은 방법이나 깨끗한 방법은 무엇입니까? 내가 본 3 가지 예외는 외양 순으로 EIdClosedSocket, EIdConnClosedGracefully, EIdSocketError (LastError = WSAECONNABORTED)입니다. 소켓의 닫는 것과 관련된 모든 예외가 재 연결을 시도하기 전에 전파 될 때까지 기다리고 싶지만 그렇게하기 위해 코드 루프를 구조화하는 방법을 모르겠습니다.

답변

2

한 번에 하나의 예외 만 스레드 코드에 도달합니다. try/except 블록을 사용하여 스레드 루프 내부의 코드를 간단히 감싸고 다음 루프 반복시 다시 연결하십시오.

while not Terminated do 
begin 
    if not Client.Connected then 
    try 
    Client.Connect; 
    except 
    Sleep(2500); 
    Continue; 
    end; 
    try 
    // communicate with device as needed... 
    except 
    on E: EIdException do 
    begin 
     // Indy socket error, reconnect 
     Client.Disconnect; 
     Client.InputBuffer.Clear; 
    end; 
    on E: Exception do 
    begin 
     // something else happened in your code... 
    end; 
    end; 
end; 
+0

그러나 예외적으로 "새로 추가 된"연결을 실행 가능하게 유지하려면 Except 블록이 다시 실행됩니다. 그 맞습니까? 그게 문제가되지 않니? BTW, 기회가 생기면 AviSaveOptions()가 제시 한 코덱 목록 새로 고침과 관련하여 스택 오버플로에서 열어 본 다른 게시물에 대한 의견을 듣고 싶습니다. http://stackoverflow.com/questions/11013713/how- do-i-refresh-the-video-codecs-in-the-list-by-avisaveoptions –

+2

아니요, 설명하는 내용이 정확하지 않습니다. 앞에서 말했듯이 단 하나의 예외만으로 코드가 손상 될 수 있습니다. 'EIdClosedSocket' 또는'EIdConnClosedGracefully' 또는'EIdSocketError'일지도 모르지만 한 번에 3 개가 될 수는 없습니다. 그리고'Disconnect()'자체는 전혀 예외를 발생시키지 않아야하지만, 그렇다면'DisconnectSocket()'을 대신 사용해보십시오. –

+0

감사합니다. 어떤 이유로 든 하나 이상의 예외가 발생했다는 인상을 받았지만, 중단 점을 설정하고 둘 이상의 인스턴스에서 예외를보고 그 인스턴스를 모두 같은 인스턴스로 오인했기 때문일 수 있습니다 . –