【问题标题】:TWebBrowser and ProcessMessagesTWebBrowser 和 ProcessMessages
【发布时间】:2017-06-20 00:52:57
【问题描述】:

使用 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 代码以实现异步?

【问题讨论】:

    标签: delphi c++builder twebbrowser


    【解决方案1】:

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

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

    【讨论】:

    • 所以我的想法是正确的,如果我想做一件事(设置一个空白页)然后下一个,依靠 ProcessMessages 是不安全的?
    • 另外,有没有更合适的事件处理程序可以使用?示例代码等待READYSTATE_LOADED,这可能发生在OnDocumentCompleteREADYSTATE_COMPLETE 之前。 (在实践中,特别是在导航到 about:blank 时,我怀疑几乎没有区别。)
    • 对于这个特定的例子,我得到了错误的事件是合理的,但这个概念是合理的。切换到事件驱动设计。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2016-05-02
    • 2010-11-18
    相关资源
    最近更新 更多