2009-11-19 32 views
2

我试图开发一个插件,它可以在计划任何类型的eclipse作业时做一些工作。Eclipse所有作业监听器

基本上我希望能够知道任务在进度对话框中并监视它。

有没有可以设置的听众来捕捉这些工作的乞讨和结束?

回答

2

当你考虑它时,ProgressView就是这样做的:每当一个Job开始时,它就会在它的视图中显示它。
注意,因为在这个线程提到的,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()); 

    } 
+0

伟大的答案,VonC。 :竖起大拇指: – pimpf0r 2009-11-19 12:19:38

+0

谢谢,明天我会试试看。 – Valadas 2009-11-20 00:08:51

0

你可以听JobChangeListenerIJobManager用于作业的开头和结尾。

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); 

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