【发布时间】:2013-12-17 13:13:16
【问题描述】:
我正在开发一个 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 线程就不会挂断。
【问题讨论】:
-
您需要向我们展示一些代码来说明问题。
-
@greg-449 我添加了示例代码。你能帮帮我吗?
-
我说你应该按照你的分析建议做:)
-
Job看起来不错,正如您所说,它可能是setScale。我对此一无所知。
标签: eclipse user-interface canvas eclipse-rcp draw2d