java - 从线程更新进度条时,SWT 窗口变得无响应

标签 java multithreading swt

我正在编写一个 java swt 应用程序来处理服务器日志文件并生成带有一些分析的 Excel 工作表,而且我这样做没有任何问题。

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

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

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 变得无响应。我无法移动 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);
                    }
                });

关于java - 从线程更新进度条时,SWT 窗口变得无响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30304309/

相关文章:

java: 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在 '?' 附近使用的正确语法

java - 为什么这个多线程代码被破坏了?

带锁的C#多线程导致死锁

java - 如何创建复合 Action

java - 使用 SNMP java 管理器监控 Windows 变量

java - 如何在 Android 应用程序中集成 Google Ads?

java - 当我尝试打印 vector 元素时,我得到这些奇怪的字符!

java - RxJava的clear(CompositeDisposable)方法内部是如何工作的?

java - 将标签更改为文本框/按钮

java - 在 Eclipse 中禁用 TreeViewer 的 Alt+Enter