我正在编写一个java swt应用程序来处理服务器日志文件并使用一些分析生成Excel表格,我没有这样做的问题。从线程更新进度条时,SWT窗口变得无响应
当我尝试更新进度栏时出现问题。
以下是代码的基本流程。用户使用directoryDialog选择日志文件并按下开始按钮。点击按钮时,执行以下代码。
startButton.addMouseListener(new MouseAdapter() {
public void mouseUp(MouseEvent e) {
pm.setUserData(ud,progressBar);
progressBar.getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
pm.startProcessing();
}
});
}
在文件的实际处理发生的类中,有简单的while循环,直到它到达文件的末尾。从文件读取每行后,我调用更新进度栏的方法。
while ((logEntry = br.readLine()) != null) {
readSize += logEntry.length() + 1;
//some long processing logic
progressBar.setSelection(getProgress());
}
getProgress()是计算该文件的百分读
(read/total)*100
上述程序正在工作的简单方法。我收到了预期的结果。进度条更新,但gui变得无法响应。我无法移动窗户。我无法点击关闭按钮。
我尝试使用摆动工人和display.asyncExec()
日志文件的范围从几MB上绿带。因此,如果UI变得无响应,用户可能会认为应用程序冻结并终止它 – kamesh
我认为读取/处理日志文件是在不同于运行GUI的主线程的线程中完成的? – Stugal
似乎[that](http://stackoverflow.com/a/16714819/2894369)可以帮助你。您也可以尝试使用['Executors'](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html)执行任务,使用'asyncExec()'更新UI。 – alex2410