<!--CodeS-->
function TmainFrm.GetResult(Qry : String) : String;
var
ResultStr : String;
begin
ResultStr := IdHTTP1.Get('http://.../recive.php?Qry='+Qry);
result := ResultStr;
end;
<!--CodeE-->
위와 같은 형태로 사용하고 있는데요..
내용에따라 GetResult를 호출하는 다르긴 하지만 한번실행에 2만건 정도 처리를 합니다.
그런데 랜덤하게 서버리는데요.. 천건 이상 나가질 않네요..
Get을 호출 하시기 전에, 위에 제가 답변드린 ReadTimeout을 먼저 설정하시고(한번만 설정하시면 됩니다.), 그리고 Connected 라는 속성으로 현재 아직 연결되서 결과를 받아오고 있는 중인지 확인 하고 Get을 호출 하시면 됩니다. 물론.. 쓰레드가 아닌 타이머로 하셨다면 Connected 속성은 검사하실 필요가 없겠죠.. 결과를 받아야 다음으로 넘어가니까요.
인디를 최신버전으로 업데이트 한 후 설정을 조금 바꾸어 다시 해보았습니다.
업데이트 버전은 10.0.52 입니다.
그래도 멈추는건 여전하네요..
function TmainFrm.GetResult(Qry : String) : String;
var
ResultStr : String;
begin
if IdHTTP1.Connected then begin
IdHTTP1.Free;
end;
IdHTTP1.ReadTimeout := 3000;
ResultStr := IdHTTP1.Get('http://.../recive.php?Qry='+Qry);
result := ResultStr;
end;
호출 시에는 하나의 쓰레드에서 호출하여 받아오는 형식이므로 반드시 한번만 호출되며 연산이 끝나기 전까진 다시 호출될 수 없는 구조입니다.
위의 코드는 엑세스 바이올레이션 에러를 낼 수 있는 코드 입니다. Free 가 아니고, Connected가 아닐때까지 기다리게 해야 합니다.
Free를 해버리고, 밑의 코드로 들어가게 되면 바로 엑세스 바이올레이션 에러가 나게 됩니다.
그리고 연산이 끝나기 전까지 다시 호출 될수 없는 코드라면, 위의 Connected 문 자제가 필요 없습니다.
아마 멈추는 문제는 쓰레드를 다루실때 무엇인가 잘못 다루고 계실지도 모르는것 같습니다.
테스트로 Timer로 동작하게 한번 해보세요. 그래서 멈추지 않는다면, 쓰레드 다루는 부분에 문제가 있어 보입니다.
타이머로 계속 불러오는 것인가요?
저는 델2007에 내장된 인디를 사용하는데, 한달 넘게 켜놓아도.. 문제 없었습니다.
ReadTimeout 이라는 속성과, Conntected 라는 속성을 이용해보세요.
Get하시기 전에 이미 연결을 시도하고 있는지 검사도 하시구요..
네트워크 상황에 따라 연결 자체가 오래 걸릴수 있으니까요.