【问题标题】:Unable to cancel zooming operation using Job无法使用作业取消缩放操作
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 2013-01-07
    • 1970-01-01
    相关资源
    最近更新 更多