TWebBrowser和ProcessMessages

时间:2017-02-02 19:38:13

标签: delphi c++builder twebbrowser

使用TWebBrowser的示例代码通常会插入一个循环来调用Application.ProcessMessages,直到ReadyStateREADYSTATE_LOADED

例如,从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代码重新设计为异步?

1 个答案:

答案 0 :(得分:5)

您根本不需要致电ProcessMessages。您可以让主应用程序消息循环处理消息。

但是这里的代码在执行下一个任务之前正在等待页面加载。要保留这种行为,请切换到异步事件驱动方法。删除循环,改为处理浏览器的OnDocumentComplete事件。只有这样才能加载流中的实际内容。