无法使用作业取消缩放操作

时间:2013-12-17 13:13:16

标签: eclipse user-interface canvas eclipse-rcp draw2d

我正在开发一个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线程不会挂断。

1 个答案:

答案 0 :(得分:0)

问题仅与setScale()方法有关。由于大的画布大小,setScale()在UI线程中需要很长时间。

基本上Job用于在后端执行非UI活动。对于UI活动,busy indicator是合适的。但是,由于我想取消扩展任务,我使用的是用户Job。可以使用忙指示符来解决问题,因此不能提供取消操作。