我有一个方法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()
方法。我的控制台打印结束 sop “作业已成功完成”,以便再次单击。
所以,如果用户第二次点击相同的操作,我想给用户一条消息,说等待上一个作业完成。我如何知道第一个作业运行的状态,以便我可以给出消息?我想我需要在方法中创建新工作之前做出决定buildTargets()
?
提前致谢!