Delphi 的 Chromium 嵌入 - 当显示模态 window 时,不会触发 TChromiumOSR.OnPaint

Chromium-embedded for Delphi - TChromiumOSR.OnPaint is not fired when a modal window is shown

我正在使用 dcef3 包中的离屏渲染组件 TChromiumOSR - Chromium-embedded 库的 Delphi 包装器。

情况

FormA 包含一个 TChromiumOSR 并绘制输出。 Modal FormB 通过针对 FormA.TChromiumOSR.

执行一些 js 代码来修改网页

问题

TChromiumOSR.OnPaint 事件(在 FormA 中)直到 FormB.ShowModal returns 才会触发。

备注

我假设'TForm.ShowModal'方法只阻止背景表格的输入,而不是绘画?

还是cef3内部工作造成的?

请问如何解决?谢谢。

dcef3 master branch is here

我使用 ExecuteJavaScript method called from a modal form. But you might have use CEF V8 as well (that's what I haven't tested). For cases when you need to invalidate the current view manually, you can call Invalidate:

成功更新了 HTML 元素
MyChromiumOSR.Browser.Host.Invalidate(PET_VIEW);

但这是解决方法而不是解决方案。 CEF 引擎应该为您使相关元素失效。如果你想出一个 MCVE,我可以调查更多关于你的具体问题。

好的,我找到了问题的根源 - 不是 cef3 或 dcef3 中的错误,而是由于我对 Delphi Event Bus 的不当使用造成的,以及以下内容是重现问题的步骤:

  1. 在一个 'delphi event bus' 处理程序中,程序显示 modal 形式,此时主线程的执行被阻塞。
  2. 在模态窗体之上,用户执行某些操作将启动一个后台线程,该线程又会向主线程发送消息,主线程又会调用 'delphi event bus' 到 post 另一个新事件,它会依次执行一些 js 代码来更新 dcef3 中的网页,这又会触发一些 dcef3 事件(在主线程中) ,这里是程序卡住的地方——因为 TEventBus.Post() 方法被 TCriticalSection.
  3. 锁定

解决方法: 在步骤 #1 中,不要直接调用 ShowModal,而是使用 PostMessage winapi 等技术来 'delay' 执行 ShowModal.

不知道有没有描述清楚...