从线程更新进度条时 SWT window 变得无响应

SWT window becomes unresponsive while updating progressbar from a thread

我正在编写一个 java swt 应用程序来处理服务器日志文件并生成一个 excel sheet 和一些分析,我这样做没有问题。

更新进度条时出现问题

这是代码的基本流程。用户使用目录对话框选择日志文件并按下开始按钮。单击按钮时,将执行以下代码。

startButton.addMouseListener(new MouseAdapter() {
        public void mouseUp(MouseEvent e) {
            pm.setUserData(ud,progressBar);
            progressBar.getDisplay().asyncExec(new Runnable() {
                        @Override
                        public void run() {
                            pm.startProcessing();
                        }
                    });
}

在实际处理文件的 class 中,有一个简单的 while 循环,循环直到到达文件末尾。从文件中读取每一行后,我调用一个更新进度条的方法。

while ((logEntry = br.readLine()) != null) {
                readSize += logEntry.length() + 1;
                //some long processing logic
                progressBar.setSelection(getProgress());
}

getProgress() 是一种计算文件读取百分比的简单方法

(read/total)*100

以上程序运行正常。我得到了预期的结果。进度条更新,但图形用户界面变得无响应。我无法移动 window。我无法单击关闭按钮。

我尝试使用 swing worker 和 display.asyncExec()

SWT 文档明确指出 ProgressBar.setSelection() 未从 UI 线程调用时将抛出异常 (ERROR_THREAD_INVALID_ACCESS)。这意味着您要么在代码中的某处吞下异常,要么上面的代码在 UI 线程中运行。

有个snippet which shows how to update a ProgressBar from a thread:

display.asyncExec(new Runnable() {
                    @Override
                    public void run() {
                        if (bar.isDisposed ())
                            return;
                        bar.setSelection(getProgress);
                    }
                });