我正在开发一个eclipse RCP应用程序。
我有一个ScalableLayeredPane
,我有大约800个数字。
我需要使用setScale()
方法更改缩放值。
此外,我想显示使用Job进行缩放的进度。
我使用asyncexec
方法调用setScale()
函数。但是,我的GUI正在挨饿,我也无法点击取消按钮。
对此有任何帮助将不胜感激。
这就是我在做什么。
Job job = new Job("Some job") {
@Override
protected IStatus run(IProgressMonitor monitor) {
// Decide scaling amount
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
scalableLayeredPaneObj.setScale(scale); }
});
// Check if cancel is pressed and return status accordingly
if(monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
return Status.OK_STATUS;
}
};
job.addJobChangeListener(new JobChangeAdapter() {
@Override
public void done(IJobChangeEvent event) {
if(event.getResult().isOK()) {
System.out.println("Job done!");
// Do something
} else {
System.out.println("Job cancelled!");
// Do something else
}
}
});
job.setUser(true);
job.schedule();
然而,当运行此特定代码时,GUI变得无响应并且无法按下取消按钮。我总是得到"Job done!"
消息。
我也尝试使用PlatformUI#getWorkbench()#getDisplay()#syncExec
方法来运行UI线程。那没用。
我的分析表明,setScale
操作本身需要很长时间才能使GUI无响应。我需要从另一个线程调用setScale
(如果可能),以便Main
线程不会挂断。
答案 0 :(得分:0)
问题仅与setScale()
方法有关。由于大的画布大小,setScale()
在UI线程中需要很长时间。
基本上Job
用于在后端执行非UI活动。对于UI活动,busy indicator
是合适的。但是,由于我想取消扩展任务,我使用的是用户Job。可以使用忙指示符来解决问题,因此不能提供取消操作。