2017-02-02 10 views
2

TWebBrowser를 사용하기위한 샘플 코드는 일반적으로 을 호출하여 ReadyStateREADYSTATE_LOADED 일 때까지 호출합니다.TWebBrowser 및 ProcessMessages

는 예를 들어, Embarcadero forums에서 일부 코드는 TWebBrowser에 HTML 문자열을로드 : ProcessMessages를 호출

내가 알고있는 것처럼
mWebBrowser->Navigate(L"about:blank"); 
while (mWebBrowser->ReadyState< READYSTATE_LOADED) 
    Application->ProcessMessages(); 

// load mWebBrowser from TStreamAdapter 

가, 위험, 그것은 재진입 문제를 만들 수 있기 때문이다. 예를 들어 사용자가 양식의 닫기 버튼을 클릭하면 해당 메시지는 ProcessMessages에 의해 처리되어 함수가 반환 될 때 TWebBrowser 인스턴스가 더 이상 존재하지 않게됩니다.

이 정보를 올바르게 이해하고 있습니까?

그렇다면 ProcessMessages의 위험없이 메시지를 처리해야하는 TWebBrowser의 필요를 처리하는 "안전한"방법이 있습니까? 아니면 모든 TWebBrowser 코드를 비동기 적으로 재 설계해야합니까?

답변

5

ProcessMessages으로 전화 할 필요가 없습니다. 메인 애플리케이션 메시지 루프가 메시지를 처리하도록 할 수 있습니다.

하지만 코드는 다음 작업을 수행하기 전에 페이지가로드 될 때까지 기다리고 있습니다. 이러한 종류의 동작을 유지하려면 비동기 이벤트 기반 접근 방식으로 전환하십시오. 루프를 제거하고 대신 브라우저의 OnDocumentComplete 이벤트를 처리하십시오. 그래야만 스트림에서 실제 콘텐츠를로드 할 수 있습니다.

+0

그래서 한 가지 (빈 페이지 설정)하고 다음으로 처리하려는 경우 ProcessMessages에 의존하는 것이 안전하지 않다고 생각합니다. –

+0

또한 더 적절한 이벤트 처리기를 사용할 수 있습니까? 예제 코드는'READYSTATE_LOADED'를 기다린다. 아마도'OnDocumentComplete'와'READYSTATE_COMPLETE' 전에 일어난다. (실제로는'about : blank'로 탐색 할 때, 거의 차이가 없다고 생각합니다.) –

+1

이 예제에서는 잘못된 이벤트가 발생했을 가능성이 있지만 그 개념은 확실합니다. 이벤트 기반 디자인으로 전환하십시오. –