델파이7과 Indy10 의 idHttp를 이용하여 웹페이지를 쓰레드로 가져오는
프로그램을 제작중입니다.
아래와 같은 코드가 한개의 Thread에서 5~10개정도씩 호출됩니다.
(총 2000번정도 호출)
function Test:boolean;
var
AHttp:TIdHTTP;
ARefer:string;
AURL:string;
SS:TStringStream;
begin
Result := True;
SS := TStringStream.Create('');
try
AHttp := TIdHTTP.Create(nil);
//AHttp.CreateIOHandler(nil);
//ApplyRandomProxy(AHttp);
with AHttp.Request do begin
Accept := 'text/html, application/xhtml+xml, */*';
AcceptEncoding := 'gzip, deflate';
...
end;
//Timeout 설정
AHttp.ReadTimeout := InfoData.READ_TIMEOUT;
AHttp.ConnectTimeout := InfoData.CONNECT_TIMEOUT;
try
//정상적인 처리가 아닌경우 Exception이 있는데도 오류발생!
//readtimeout, connecttimeout등등
AHTTP.Get( AURL, SS);
except
on E: Exception do begin
Site38_Except.WriteExceptOnFile( e.message, ThreadID, AHttp.responsecode );
if Assigned(AHttp) then begin
AHttp.Disconnect;
AHttp.Free;
end;
Result := False;
exit;
end;
end;
SS.Position := 0;
...
end;
문제는 idHttp가 Get해올때 정상적인 응답이 아닐경우(readtimeout, connecttimeout등)
Exception에서 처리를 해줬는데도 해당 프로시저에서 오류가 발생후
Thread의 Execute에서 Access violation이 납니다.
ioHandler도 써보고 한 사이트에 같은 Ip로 커넥션이 많은거 같아 Proxy로 10개씩 나눠보기도하고...
여러가지 방법을 써봤지만 답을 모르겠습니다. ㅠㅠ
1. idHttp의 에러시 Exception 처리말고 해줘야 하는게 있는지?
(EIdException으로 잡아봤지만 동일한 결과였습니다.)
2. 당연히 Access violation후에는 메모리 반환이 안됩니다.
3. indy포럼에서 idComponent, idThread, idStack에서 filnalize로 메모리릭을 제거하는 코드도 사용했습니다.
혹시나 같은 경험이 있으신분들은 답변 부탁드립니다.
감사합니다.
|