我在dcef3包中使用屏幕外呈现组件dcef3--用于Chromium-embedded库的Delphi包装器。
情况
FormA包含一个TChromiumOSR并绘制输出。模态FormB通过对FormA.TChromiumOSR执行一些js代码来修改网页。
问题
TChromiumOSR.OnPaint事件(在FormA中)在FormB.ShowModal返回之前不会触发。
备注
我假设`TForm.ShowModal的方法只会阻塞背景表单的输入,而不是画图?
还是由cef3的内部工作引起的?
不管怎样,怎么解决呢?谢谢。
发布于 2018-03-03 16:29:10
好的,我找到了问题的根源--它不是在cef3或dcef3中的一个bug,而是由我不正确地使用Delphi事件总线引起的,下面是重现这个问题的步骤:
js代码来更新dcef3中的网页,这反过来将触发一些dcef3事件(在主线程中),这里是程序卡住的地方--因为TEventBus.Post()方法被TCriticalSection锁定。解决方案:在步骤1中,不要直接调用ShowModal,而是使用诸如PostMessage winapi这样的技术来“延迟”ShowModal的执行。
我不确定我是否把它描述得很清楚..。
发布于 2018-02-27 21:15:52
通过使用从模式表单调用的ExecuteJavaScript方法,我成功地更新了一个HTML元素。但是您可能也使用了CEF V8 (这是我还没有测试过的)。对于需要手动使当前视图无效的情况,可以调用无效
MyChromiumOSR.Browser.Host.Invalidate(PET_VIEW);但这是解决办法,而不是解决办法。相关元素的无效应该由CEF引擎为您发生。如果你想出一个MCVE,我可以对你的具体问题做更多的调查。
https://stackoverflow.com/questions/49005093
复制相似问题