C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[1500] Re:THTML->RequestDoc() 을 batch로 하려면?
박지훈.임프 [cbuilder] 3504 읽음    1999-06-30 00:00
:
: void _fastcall Button1Click(TObject *Sender)
: {
:  String URL;
:  THTML HTML1;
:  for(i = 0; i < MAX; ++i) {
:
:     URL = buffer[i];
:     HTML1->RequestDoc(URL);
:
:    // Save HTML to file
:    // ...
:  }
: }
:
:  이런 식으로 프로그램하면 for loop를 다 수행한다음
:  메세지 함수 Button1Click에 종료되고 RequestDoc을
:  가장 마지막에 카피한 URL에 대하여 한번만
:  수행하는 것 같습니다.

:  어떻게 해야 할까요?
:

:

임펠리테리입니다.
보여주신 소스는.. 좀 죄송합니다만, 당연히 제대로 동작하지 않습니다.
HTTP 프로토콜의 기본을 생각하면 아주 쉽게 이해가 되실 겁니다.
HTTP는, 그 기반에 tcp를 사용하기는 합니다만, 그 프로토콜 자체에서는
무연결 지향의 프로토콜입니다. 그러므로 사용하신 THTML의 멤버함수
RequestDoc()는, 단순히 http를 통해 해당 url의 웹서버에게 해당
웹문서를 보내달라는 요청을 할 뿐이지 그 문서를 모두 받을 때까지
기다려서 처리해주지 않습니다.

보여주신 소스에서는 for() 문을 통해 연속적으로 서로 다른 여러
웹페이지의 서버에게 각각 요청을 보냈는데, 요청을 보내자마자
그 다음번 주소로 다시 요청을 보냈으므로 그 이전에 요청한 웹서버로부터의
응답은 무시하게 되는 겁니다. 응답을 무시했으므로 웹서버에서는
계속적으로 컨텐츠를 보내주지 않구요.

해결 방법은, for()문을 이용하여 단순한 반복을 하지 말고, 최초의
리퀘스트를 하는 함수 외에, THTML의 이벤트인 OnEndRetrieval의
핸들러를 만들어서 요청한 모든 웹문서를 받은 후에 다음 요청을 보내야 합니다.
(OnEndRetrieval 이벤트는 요청한 url의 웹문서를 모두 받았을 때
발생하는 이벤트입니다.)

실제로 사용가능한 예제 코드를 보여드리죠.

새 프로젝트를 시작해서, 폼에 THTML 컴퍼넌트와 버튼 하나를 놓고,
폼 클래스의 헤더파일을 열어서 public: 섹션에 두개의 새 변수를
추가합니다.

public:
    int Counter;
    TStringList *UrlList;

그런 후에, 폼을 더블클릭해서 폼의 OnCreate 핸들러를 만들고, 다음과
같이 코딩합니다.

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    UrlList = new TStringList;
    UrlList->Add("www.borland.com");
    UrlList->Add("www.microsoft.com");
    UrlList->Add("www.java.sun.com");
    UrlList->Add("www.oracle.com");
}

그리고, 버튼의 OnClick 핸들러를 만들어야겠죠?

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    Counter = 0;
    HTML1->RequestDoc(UrlList->Strings[0]);
}

마지막으로, 앞에서 말한대로 HTML1 컨트롤의 OnEndRetrieval 핸들러를 만듭니다.

void __fastcall TForm1::HTML1EndRetrieval(TObject *Sender)
{
    // Save HTML to file
    Counter++;
    if(Counter < UrlList->Count)
        HTML1->RequestDoc(UrlList->Strings[Counter]);
}

이것으로 완성입니다. 실행해보시면, UrlList 리스트에 포함된 웹사이트들을
차례로 방문하는 것을 볼 수 있으실 겁니다. HTML을 저장하는 루틴을
포함하시려면 위에 주석처리한 "// Save HTML to file" 부분에서
해주시면 되구요.

그럼, 도움되시길...


+ -

관련 글 리스트
1496 THTML->RequestDoc() 을 batch로 하려면? 김상우 3518 1999/06/26
1500     Re:THTML->RequestDoc() 을 batch로 하려면? 박지훈.임프 3504 1999/06/30
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.