从线程更新进度条时 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);
}
});
我正在编写一个 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);
}
});