从线程

时间:2015-05-18 13:19:17

标签: java multithreading swt

我正在编写一个java swt应用程序来处理服务器日志文件并使用一些分析生成excel表,我没有遇到任何问题。

当我尝试更新进度条时出现问题。

这是代码的基本流程。用户使用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变得反应迟钝。我无法移动窗户。我无法点击关闭按钮。

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

1 个答案:

答案 0 :(得分:2)

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);
                    }
                });