Я написал класс C ++, который инкапсулирует веб-браузер (вдохновленный этот). Один из методов класса принимает HTML-код в виде строки и отображает его в браузере. Рендеринг в браузере выполняется асинхронно, и в некоторых ситуациях необходимо дождаться завершения загрузки документа, прежде чем продолжить. Я не уверен, правильно ли я это делаю.
Что я делаю, так это открываю новый документ, звоню IHTMLDocument2::put_onreadystatechange
(передавая экземпляр EventSink
класс, который я реализовал), и вызов IHTMLDocument2::write
отрендерить нужный HTML. Это все сделано в основном потоке.
Затем основной поток продолжается с другими вещами. Через некоторое время, когда состояние готовности меняется, браузер вызывает EventSink::Invoke
, Там я звоню IHTMLDocument2::get_readyState
и проверьте, равно ли оно complete
, Это также происходит в основном потоке (вызываемом COM через заглушку клиента, если мое понимание верно).
Проблема заключается в том, что, хотя я обнаруживаю, когда загрузка документа завершена, основной поток в это время занимается другими делами, возможно, обращаясь к HTML DOM. Так что я бы хотел Подождите для заполнения документа сразу после звонка IHTMLDocument2::write
, Как этого добиться? Я не могу установить семафор события в приемнике событий и ждать его, потому что оба фрагмента кода выполняются основным потоком. Так я должен действительно использовать рабочий поток здесь? Я несколько смущен тем, какой поток будет делать что. Например. поток, вызванный заглушкой COM-клиента, установит семафор события после завершения загрузки, но какой это поток — всегда основной поток или поток, создавший COM-объект? Любая помощь приветствуется.
Задача ещё не решена.