Eclipse所有工作监听器

时间:2009-11-19 10:58:40

标签: java eclipse

我正在尝试开发一个插件,可以在安排任何类型的日食工作时做一些工作。

基本上我希望能够知道作业何时进入进度对话框并进行监控。

是否有一个可以设置的监听器来抓住这些工作的乞讨和结束?

2 个答案:

答案 0 :(得分:2)

当你考虑它时,ProgressView就是这样做的:每当一个工作开始时,它就会在它的视图中显示它。
注意,正如在这个帖子中提到的那样ProgressView is tightly coupled with the eclipse Jobs API(即,它可能不会监视任何普通的香草线程)

alt text
(来自文章On the Job: The Eclipse Jobs API

您可以首先查看org.eclipse.ui.internal.progress.ProgressView中的代码,该代码需要ProgressViewerContentProvider,基于ProgressContentProvider(实现IProgressUpdateCollector

所有东西似乎都基于ProgressViewUpdater单例,它创建了一个负责监视这些作业的UI线程:

    /**
     * Create the update job that handles the updatesInfo.
     */
    private void createUpdateJob() {
        updateJob = new WorkbenchJob(ProgressMessages.ProgressContentProvider_UpdateProgressJob) {
            /*
             * (non-Javadoc)
             * 
             * @see org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.runtime.IProgressMonitor)
             */
            public IStatus runInUIThread(IProgressMonitor monitor) {

                //Abort the job if there isn't anything
                if (collectors.length == 0) {
                    return Status.CANCEL_STATUS;
                }

                if (currentInfo.updateAll) {
                    synchronized (updateLock) {
                        currentInfo.reset();
                    }
                    for (int i = 0; i < collectors.length; i++) {
                        collectors[i].refresh();
                    }

                } else {
                    //Lock while getting local copies of the caches.
                    Object[] updateItems;
                    Object[] additionItems;
                    Object[] deletionItems;
                    synchronized (updateLock) {
                        currentInfo.processForUpdate();

                        updateItems = currentInfo.refreshes.toArray();
                        additionItems = currentInfo.additions.toArray();
                        deletionItems = currentInfo.deletions.toArray();

                        currentInfo.reset();
                    }

                    for (int v = 0; v < collectors.length; v++) {
                        IProgressUpdateCollector collector = collectors[v];

                        if (updateItems.length > 0) {
                            collector.refresh(updateItems);
                        }
                        if (additionItems.length > 0) {
                            collector.add(additionItems);
                        }
                        if (deletionItems.length > 0) {
                            collector.remove(deletionItems);
                        }
                    }
                }

                return Status.OK_STATUS;
            }
        };
        updateJob.setSystem(true);
        updateJob.setPriority(Job.DECORATE);
        updateJob.setProperty(ProgressManagerUtil.INFRASTRUCTURE_PROPERTY, new Object());

    }

答案 1 :(得分:0)

您可以在JobChangeListener中收听IJobManager作业的开头和结尾。

IJobManager manager = Job.getJobManager();
manager.addJobChangeListener(myJobChangeListener);

IJobChangeListener收到以下事件。

public void aboutToRun(IJobChangeEvent event);
public void awake(IJobChangeEvent event);
public void done(IJobChangeEvent event);
public void running(IJobChangeEvent event);
public void scheduled(IJobChangeEvent event);
public void sleeping(IJobChangeEvent event);

但是,我还没有找到一种方法来跟踪正在运行的作业的进度。如果有人,我会很好奇。