【问题标题】:Give the message to the user while running the job在运行作业时向用户发送消息
【发布时间】:2013-10-22 14:29:55
【问题描述】:

我有一个方法buildTargets(),当用户单击其中一个 UI 菜单操作时会调用它。

static public void buildTargets(Shell shell, final IMakeTarget[] targets) {
        saveAllResources(targets);
        Job targetJob = new Job(MakeUIPlugin.getResourceString("TargetBuild.backgroundTask.name")) { //$NON-NLS-1$
            @Override
            protected IStatus run(IProgressMonitor monitor) {
                monitor.beginTask(MakeUIPlugin.getResourceString("TargetBuild.monitor.beginTask"), targets.length); //$NON-NLS-1$
                try {
                    for (int i = 0; i < targets.length; i++) {
                        final IMakeTarget target = targets[i];
                        IWorkspaceRunnable runnable = new IWorkspaceRunnable() {

                            public void run(IProgressMonitor monitor) throws CoreException {
                                target.build(new SubProgressMonitor(monitor, 1));                               
                            }
                        };

                        MakeUIPlugin.getWorkspace().run(runnable, null, IResource.NONE, new SubProgressMonitor(monitor, 1));
                    }
                } catch (CoreException e) {
                    return e.getStatus();
                } catch (OperationCanceledException e) {
                } finally {
                    monitor.done();
                }
                return Status.OK_STATUS;
            }

            @Override
            public boolean belongsTo(Object family) {
                return ResourcesPlugin.FAMILY_MANUAL_BUILD == family;
            }           
        };

        // workaround for bug 270326, initialize CUIPlugin preference store to avoid race condition
        CUIPlugin.getDefault().getPreferenceStore().getString("dummy"); //$NON-NLS-1$
        targetJob.schedule();

    }
}

当用户再次单击相同类型的操作时,它会在运行第一个操作时简单地忽略第二个请求。这是我的要求,我认为IWorkspace.run() 方法正在这样做(据我所知)。第二个操作是执行除IWorkspace.run() 方法之外的所有代码。

我已经尝试添加一个监听器。

targetJob.addJobChangeListener(new JobChangeAdapter() {
public void done(IJobChangeEvent event) {
    if (event.getResult().isOK())
       System.out.println("Job completed successfully");
    else
       System.out.println("Job did not complete successfully");
    }
 });

targetJob.setSystem(true);

但是当我在运行第一个作业时第二次单击菜单操作时,我的处理程序的execute() 方法仍然调用buildTargets() 并执行所有代码而不运行IWorkspace.run() 方法。我的控制台打印结束 s.o.p.第二次点击“作业成功完成”。

所以,如果用户第二次点击相同的操作,我想给用户一条消息,说等待上一个作业完成。我如何知道第一个作业运行的状态,以便我可以给出消息?我想我需要在使用buildTargets() 方法创建新工作之前做出决定?

提前致谢!

【问题讨论】:

    标签: eclipse-plugin eclipse-rcp eclipse-cdt jobs


    【解决方案1】:

    当您创建 Job 时,您可以添加 IJobChangeListener 以接收有关作业状态的通知:

    targetJob.addJobChangeListener(listener);
    

    侦听器有一个done 方法,该方法在作业完成时被调用。

    当作业被作业更改侦听器“完成”方法安排和清除时,您需要维护一个“作业活动”标志设置。菜单处理程序必须检查这个标志。

    【讨论】:

    • 嗨,格雷格,感谢您的快速回复。请检查我更新的问题?
    • 你需要有一个工作活动标志来测试 - 添加到答案
    【解决方案2】:

    我使用java.util.concurrent.locks.ReentrantLock 来解决我的问题。谢谢!

    【讨论】:

      猜你喜欢
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 2022-12-15
      • 1970-01-01
      • 2017-06-04
      • 1970-01-01
      • 2017-05-16
      • 2019-07-24
      相关资源
      最近更新 更多