Delphi TWebBrowser和ProcessMessages
使用TWebBrowser的示例代码通常会插入一个循环来调用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
应用程序。处理消息
,直到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
时,我怀疑这两者之间没有什么区别。)对于这个特定的示例,我得到了错误的事件是有道理的,但这个概念是正确的。切换到事件驱动设计。