如何在C ++中正确等待IWebBrowser2的“文档完成”事件?

时间:2015-01-03 22:37:51

标签: c++ winapi asynchronous com iwebbrowser2

我编写了一个封装Web浏览器的C ++类(受this启发)。其中一个类方法将HTML代码作为字符串并在浏览器中呈现。浏览器的呈现是异步的,在某些情况下,必须等到文档加载完成后再继续。我不确定我是否正确这样做。

我所做的是打开一个新文档,调用IHTMLDocument2::put_onreadystatechange(传递我实现的EventSink类的实例),然后调用IHTMLDocument2::write来呈现所需的HTML。这一切都在主线程中完成。

主线程继续其他事情。一段时间后,当就绪状态发生变化时,浏览器会调用EventSink::Invoke。在那里,我致电IHTMLDocument2::get_readyState并检查它是否等于complete。这也发生在主线程中(如果我的理解是正确的话,COM通过客户端存根调用)。

问题在于虽然我检测到文档加载何时完成,但主线程同时也在做其他事情,可能是访问HTML DOM。因此,我希望在致电IHTMLDocument2::write后立即等待完成文档。如何实现这一目标?我无法在事件接收器中设置事件信号量并等待它,因为两个代码段都由主线程执行。那么我真的应该在这里使用工作线程吗?我对哪个线程会做什么感到有些困惑。例如。 COM客户端存根调用的线程将在加载完成时设置事件信号量,但是哪个线程是 - 总是主线程,还是创建COM对象的线程?任何帮助表示赞赏。

0 个答案:

没有答案