使用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处理,这样,当函数返回时,TWebBrowser实例甚至不再存在。)
我理解正确吗?
如果是这样,是否存在一种“安全”的方式来处理TWebBrowser处理消息的需求,而没有ProcessMessages的风险?还是我需要重新设计所有TWebBrowser代码以使其异步?
最佳答案
您根本不需要调用ProcessMessages
。您可以让主应用程序消息循环处理消息。
但是这里的代码在执行下一个任务之前正在等待页面加载。要保留这种行为,请切换到异步事件驱动的方法。删除循环,而是处理浏览器的OnDocumentComplete
事件。只有这样,您才从流中加载实际内容。