Java SWT:UI在Mac/Linux的主线程中使用display.async和后台任务缓慢更新
我有一个后台操作,比如将高达3GB的数据复制到设计目录。同时,我在UI上显示了一个SWT进度条和一个标签,该标签可以异步更新(Java SWT:UI在Mac/Linux的主线程中使用display.async和后台任务缓慢更新,java,multithreading,asynchronous,swt,Java,Multithreading,Asynchronous,Swt,我有一个后台操作,比如将高达3GB的数据复制到设计目录。同时,我在UI上显示了一个SWT进度条和一个标签,该标签可以异步更新(display.asyncExec)。复制操作在一个新线程内执行,该线程在单击按钮时激活。在复制操作中,我正在更新progressmonitor的mon.worked()方法,该方法更新UI。我正在使用eclipse的IProgressMonitor创建我的monitor类 复制操作几乎不需要2-3分钟(MacOsx 10.8.3 8GB Ram,i7),但UI进度条甚至
display.asyncExec
)。复制操作在一个新线程内执行,该线程在单击按钮时激活。在复制操作中,我正在更新progressmonitor的mon.worked()
方法,该方法更新UI。我正在使用eclipse的IProgressMonitor
创建我的monitor类
复制操作几乎不需要2-3分钟(MacOsx 10.8.3 8GB Ram,i7),但UI进度条甚至还没有完成一半。进度条仅在5-6分钟后显示“完成”。这使得复制操作的时间似乎比预期的要长
我正在更新进度条和标签(显示当前正在复制的文件)
我观察到,当我只更新一个组件时,无论是ProgressBar还是Label,UI都会快速更新
我不想使用display.syncexec来恢复,因为这需要很长时间,而且UI冻结的可能性也很高
我们将非常感谢您在这个问题上给予我的任何帮助/指点
注意:奇怪的是,我在Win 7上没有遇到这个问题。您多久调用一次
IProgressMonitor.worked
?复制每个文件后,我调用IProgressMonitor.worked()API来更新进度条和标签(文件名)如果有很多小文件,您可能会淹没asyncExec
事件队列。EclipseSearch
results视图可能会出现这种情况。您能在更新UI后尝试调用Display.update()吗?@greg-449我能够通过减少更新的频率使ProgressBar显示得更快。但我仍然想知道它如何在Win7上正常工作。