2013-03-13 58 views
2

我在修改后的eclipse(Indigo)中将org.eclipse.swt.browser.Browser嵌入到视图中,用作表单编辑器组件的预览窗格。在表单模型更改或元素选择更改时,代码通过vaadin 6呈现表单并将其显示在浏览器组件中。SWT浏览器组件块SWT UI线程

现在,这在大多数情况下就像一个魅力。但对于一些高度复杂的表单,由vaadin生成的HTML + JS会在浏览器上产生很大的压力,使其在几秒钟内无响应。这本身并不是悲剧(1),但只要SWT Browser组件忙于渲染那些东西,整个eclipse UI线程就会被阻塞。

重现此操作的一种简单方法是创建一个阻止JavaScript函数(例如参见https://gist.github.com/creinig/5150747)的HTML页面并将其显示在SWT浏览器中。只要该JS函数正在运行,整个SWT应用程序就不会对任何事情做出响应。

唯一的信息,我已经在这个问题上找到的

并不实用:(

的浏览器组件的API docs似乎并没有提供关于其是否呈现由UI线程定期触发任何见解,或者本身引发的东西,块的UI。

有没有办法去耦从SWT UI线程?还是别的什么可以做,以保护日食UI从浏览器挂东西浏览器组件的渲染?


(1):我们需要这种复杂度级别的表单,我们已经在优化渲染性能,并且转向vaadin7很可能也会加快速度。但是问题一定会持续下去,只要降低严重程度。

回答

0

不是一个真正的解决方案,而是一个解决方法Works For Me(TM): 正如here所述,从SWT启动系统的默认浏览器非常简单。因此,我将向包含浏览器控件的视图添加一个选项,通过禁用浏览器控件并打开系统浏览器来“分离”视图。

如果链接页面下降断网,这里的要点是:

org.eclipse.swt.program.Program.launch("http://my.funny.url/"); 

启动http网址注册的应用程序。换句话说:系统默认浏览器。 幸福随之而来:)