TWebBrowser 和 ProcessMessages
TWebBrowser and ProcessMessages
使用 TWebBrowser 的示例代码通常会插入一个循环来调用 Application.ProcessMessages
,直到 ReadyState
为 READYSTATE_LOADED
。
例如,从 Embarcadero forums 中,一些代码将 HTML 字符串加载到 TWebBrowser 中:
mWebBrowser->Navigate(L"about:blank");
while (mWebBrowser->ReadyState< READYSTATE_LOADED)
Application->ProcessMessages();
// load mWebBrowser from TStreamAdapter
据我了解,调用 ProcessMessages 是有风险的,因为它会产生重入问题。 (例如,如果用户单击窗体上的关闭按钮,则该消息可能会由 ProcessMessages 处理,这样当函数 returns 时 TWebBrowser 实例甚至不再存在。)
我理解正确吗?
如果是这样,是否有 "safe" 方法来处理 TWebBrowser 处理消息的需求,而没有 ProcessMessages 的风险?或者我是否需要重新设计我所有的 TWebBrowser 代码以实现异步?
您根本不需要调用 ProcessMessages
。您可以让主应用程序消息循环处理这些消息。
但是这里的代码在执行下一个任务之前等待页面加载。要保留这种行为,您可以切换到异步事件驱动方法。删除循环并改为处理浏览器的 OnDocumentComplete
事件。只有这样,您才能从流中加载实际内容。
使用 TWebBrowser 的示例代码通常会插入一个循环来调用 Application.ProcessMessages
,直到 ReadyState
为 READYSTATE_LOADED
。
例如,从 Embarcadero forums 中,一些代码将 HTML 字符串加载到 TWebBrowser 中:
mWebBrowser->Navigate(L"about:blank");
while (mWebBrowser->ReadyState< READYSTATE_LOADED)
Application->ProcessMessages();
// load mWebBrowser from TStreamAdapter
据我了解,调用 ProcessMessages 是有风险的,因为它会产生重入问题。 (例如,如果用户单击窗体上的关闭按钮,则该消息可能会由 ProcessMessages 处理,这样当函数 returns 时 TWebBrowser 实例甚至不再存在。)
我理解正确吗?
如果是这样,是否有 "safe" 方法来处理 TWebBrowser 处理消息的需求,而没有 ProcessMessages 的风险?或者我是否需要重新设计我所有的 TWebBrowser 代码以实现异步?
您根本不需要调用 ProcessMessages
。您可以让主应用程序消息循环处理这些消息。
但是这里的代码在执行下一个任务之前等待页面加载。要保留这种行为,您可以切换到异步事件驱动方法。删除循环并改为处理浏览器的 OnDocumentComplete
事件。只有这样,您才能从流中加载实际内容。