2017-02-02 18 views
2

Пример кода для работы с TWebBrowser обычно вставляет цикл для вызова Application.ProcessMessages до ReadyState: READYSTATE_LOADED.TWebBrowser и ProcessMessages

Например, из Embarcadero forums, некоторый код, чтобы загрузить строку HTML в TWebBrowser:

mWebBrowser->Navigate(L"about:blank"); 
while (mWebBrowser->ReadyState< READYSTATE_LOADED) 
    Application->ProcessMessages(); 

// load mWebBrowser from TStreamAdapter 

Как я понимаю, называя ProcessMessages рискованно, потому что это может создать проблемы Реентерабельность. (Например, если пользователь нажимает кнопку «Закрыть» в форме, то это сообщение может обрабатываться ProcessMessages, так что экземпляр TWebBrowser больше не существует, когда функция возвращается.)

Я правильно понимаю это?

Если да, существует ли «безопасный» способ обработки запросов TWebBrowser для обработки сообщений без рисков ProcessMessages? Или мне нужно перепроектировать весь мой код TWebBrowser для асинхронности?

ответ

5

Вам не нужно звонить ProcessMessages. Вы можете разрешить основной цикл сообщения приложения с сообщениями.

Но код здесь ждет загрузки страницы перед выполнением следующей задачи. Чтобы сохранить такое поведение, вы переключаетесь на асинхронный подход, основанный на событиях. Удалите цикл и вместо этого обработайте событие OnDocumentComplete браузера. Только тогда вы загружаете фактический контент из своего потока.

+0

Итак, я правильно понял, что если я хочу сделать одно (установить пустую страницу), а затем следующий, небезопасно полагаться на ProcessMessages? –

+0

Кроме того, есть ли более подходящий обработчик событий для использования? Пример кода ждет 'READYSTATE_LOADED', который предположительно происходит до' OnDocumentComplete' и 'READYSTATE_COMPLETE'. (На практике, особенно при навигации по 'about: blank', я подозреваю, что разница в ней практически отсутствует или нет.) –

+1

Правдоподобно, что у меня есть неправильное событие для этого конкретного примера, но концепция звучит. Переключитесь на дизайн, управляемый событиями. –