Q&A

  • IdHTTP.Get 으로 일정페이지를 계속 불러오고 있습니다.
IdHTTP.Get 으로 일정페이지를 계속 불러오고 있습니다.

불규칙하게 먹통이 되버리네요..

IdHTTP.Get을 쓰기전에 초기화를 해줘야되는지 방법이 궁금합니다.

이전에 동일한 질문이 있는것을 보았는데..
답변들이 비어있어 해결책을 찾지 못하고 있습니다.

한가지 더 궁금한것이 일정시간이 지나면 무시할 수있도록 타임아웃 체크 같은것을 설정할 수 있나요?
가능하다면 어떻게 해야되는지..

조언 부탁드리겠습니다.
6  COMMENTS
  • Profile
    이정욱 2008.08.08 21:54
    Get을 사용하기 전에 초기화 같은것은 필요 없습ㄴ디ㅏ.

    타이머로 계속 불러오는 것인가요?

    저는 델2007에 내장된 인디를 사용하는데, 한달 넘게 켜놓아도.. 문제 없었습니다.

    ReadTimeout 이라는 속성과, Conntected 라는 속성을 이용해보세요.

    Get하시기 전에 이미 연결을 시도하고 있는지 검사도 하시구요..

    네트워크 상황에 따라 연결 자체가 오래 걸릴수 있으니까요.

  • Profile
    머문자리 2008.08.08 23:28
    답변 감사합니다.

    제가 사용하는 버전은 델파이7 이고 동일하게 내장된 인디를 사용하고 있습니다.

    사용방법은 단순하게 웹페이지에 질의를 통하여 결과값을 받아오는 형태로 사용하고 있습니다.

    <!--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만건 정도 처리를 합니다.
    그런데 랜덤하게 서버리는데요.. 천건 이상 나가질 않네요..

    도움 부탁드립니다.
  • Profile
    이정욱 2008.08.09 10:05
    일단 인디를 최신 버전으로 업데이트 하시길 바랍니다.

    그리고 Get으로 받아오는 스트링의 길이는 2기가가 넘지 않는 이상 문제되지 않습니다.

    Get을 호출 하시기 전에, 위에 제가 답변드린 ReadTimeout을 먼저 설정하시고(한번만 설정하시면 됩니다.), 그리고 Connected 라는 속성으로 현재 아직 연결되서 결과를 받아오고 있는 중인지 확인 하고 Get을 호출 하시면 됩니다. 물론.. 쓰레드가 아닌 타이머로 하셨다면 Connected 속성은 검사하실 필요가 없겠죠.. 결과를 받아야 다음으로 넘어가니까요.

  • Profile
    머문자리 2008.08.11 20:34
    인디를 최신버전으로 업데이트 한 후 설정을 조금 바꾸어 다시 해보았습니다.
    업데이트 버전은 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;


    호출 시에는 하나의 쓰레드에서 호출하여 받아오는 형식이므로 반드시 한번만 호출되며 연산이 끝나기 전까진 다시 호출될 수 없는 구조입니다.

    매번 답변 감사하며, 도움 부탁드립니다.
  • Profile
    이정욱 2008.08.13 04:23
    위의 코드는 엑세스 바이올레이션 에러를 낼 수 있는 코드 입니다. Free 가 아니고, Connected가 아닐때까지 기다리게 해야 합니다.
    Free를 해버리고, 밑의 코드로 들어가게 되면 바로 엑세스 바이올레이션 에러가 나게 됩니다.
    그리고 연산이 끝나기 전까지 다시 호출 될수 없는 코드라면, 위의 Connected 문 자제가 필요 없습니다.
    아마 멈추는 문제는 쓰레드를 다루실때 무엇인가 잘못 다루고 계실지도 모르는것 같습니다.
    테스트로 Timer로 동작하게 한번 해보세요. 그래서 멈추지 않는다면, 쓰레드 다루는 부분에 문제가 있어 보입니다.
  • Profile
    머문자리 2008.08.15 04:42
    답변감사합니다.
    말씀하신 부분으로 체크해봐야겠습니다.