Delphi TWebBrowser和ProcessMessages

Delphi TWebBrowser和ProcessMessages,delphi,c++builder,twebbrowser,Delphi,C++builder,Twebbrowser,使用TWebBrowser的示例代码通常会插入一个循环来调用应用程序。处理消息,直到ReadyState加载ReadyState 例如,从中,一些将HTML字符串加载到TWebBrowser的代码: mWebBrowser->Navigate(L"about:blank"); while (mWebBrowser->ReadyState< READYSTATE_LOADED) Application->ProcessMessages(); // load mWeb

使用TWebBrowser的示例代码通常会插入一个循环来调用
应用程序。处理消息
,直到
ReadyState
加载
ReadyState

例如,从中,一些将HTML字符串加载到TWebBrowser的代码:

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

// load mWebBrowser from TStreamAdapter
mWebBrowser->导航(L“关于:空白”);
同时(mWebBrowser->ReadyState处理消息();
//从TStreamAdapter加载mWebBrowser
据我所知,调用ProcessMessages是有风险的,因为它会产生重入问题。(例如,如果用户单击表单上的“关闭”按钮,则该消息可以由ProcessMessages处理,这样当函数返回时,TWebBrowser实例甚至不再存在。)

我理解正确吗


如果是这样的话,是否有一种“安全”的方式来处理TWebBrowser的消息处理需求,而不存在ProcessMessages的风险?或者我需要重新设计所有TWebBrowser代码使之异步吗?

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


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

所以我正确地认为,如果我想做一件事(设置一个空白页)然后做下一件事,依赖ProcessMessages是不安全的?还有,是否有更合适的事件处理程序可以使用?示例代码等待
READYSTATE\u加载
,这可能发生在
OnDocumentComplete
READYSTATE\u COMPLETE
之前。(在实践中,尤其是在导航到
about:blank
时,我怀疑这两者之间没有什么区别。)对于这个特定的示例,我得到了错误的事件是有道理的,但这个概念是正确的。切换到事件驱动设计。