2016-12-01 65 views
0

背景: 我正在創建一個插件來觸發另一個插件的命令。該命令執行檢查(後臺進程)並在特定程序上實現標記。等待工作區作業完成

問題: 我已經成功地以編程方式觸發了命令,但是我需要等待它完成,因爲如果我不等,我只會得到NULL集合的標記[]。

到目前爲止,這裏是我

IWorkspace workspace = ResourcesPlugin.getWorkspace(); 
IResource resource = workspace.getRoot(); 
resource.deleteMarkers(null, true, 0); 
markers = resource.findMarkers(IMarker.MARKER, true, IResource.DEPTH_INFINITE); 
Robot robot = new Robot(); 
robot.keyPress(KeyEvent.VK_CONTROL); 
robot.keyPress(KeyEvent.VK_SHIFT); 
robot.keyPress(KeyEvent.VK_F2); 
robot.keyRelease(KeyEvent.VK_CONTROL); 
robot.keyRelease(KeyEvent.VK_SHIFT);  
robot.keyRelease(KeyEvent.VK_F2); 

//...command is executed, now running background process 
//...wait for all background process to finish 

for (IMarker m : markers) { 
    System.out.println("Id: " + m.getId()); 
    System.out.println("Message: " + m.getAttribute(IMarker.MESSAGE)); 
    System.out.println("Line Number: " + m.getAttribute(IMarker.LINE_NUMBER)); 
} 

我曾嘗試實施這一

ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() { 
    public void run(IProgressMonitor monitor) throws CoreException { 

    } 
}, new NullProgressMonitor()); 

從這裏解釋:https://dzone.com/articles/eclipse-gui-testing-is-viable-

  • 而不是使用睡眠()等待要完成的事情,等待真正的事情完成。重負荷的機器可能導致處理時間發生變化。而不是有一個脆弱的睡眠(500L),使用可靠的技術來確定什麼時候工作真的完成。
  • 例如,如果你知道你的處理是持有資源 鎖,後無操作空的工作區工作,並在其上等待您的 測試中。它只會被調用一次,其他所有資源鎖是 發佈,所以它的完成時,你保證,你的其他工作 完成

    但我想我錯實現它,因爲它不等待後臺工作完成。

    任何有關做什麼的建議一定會有所幫助!

    編輯:爲了補充,執行的作業/任務/過程來自我不知道的另一個插件。因此,我不知道工作組等,我所依靠的是等待任務完成。

    回答

    0

    我不知道,但你可以嘗試使用IJobManager

    private void waitJobsComplete() { 
        final IJobManager manager = Job.getJobManager(); 
        final Job[] jobs = manager.find(null); //return all jobs 
        while(jobExists(jobs)) { 
        sleep(50); 
        } 
    } 
    private boolean jobExists(Job[] jobs) { 
        for(Job job: jobs) { 
        if(job.getState() != Job.NONE) { 
         return true; 
        } 
        } 
        return false; 
    } 
    
    +0

    嗨。謝謝!但是,這會凍結整個Eclipse工作臺,因爲它在同一個線程上運行。我不能把它放在異步,因爲它不會等待後臺進程完成。 –

    0

    您參考談論WorkspaceJob的文章,你會做什麼它建議使用類似:

    Job job = new WorkspaceJob("name") 
    { 
        @Override 
        public IStatus runInWorkspace(IProgressMonitor monitor) 
        throws CoreException 
        { 
        return Status.OK_STATUS; 
        } 
    }; 
    
    job.schedule(); 
    
    try 
    { 
        job.join(); 
    } 
    catch (InterruptedException e) 
    { 
        // 
    } 
    
    +0

    Hi @ greg-449,謝謝。但是,當我嘗試它時,它不會等待後臺進程完成。代碼仍然繼續,我錯過了什麼或有沒有另一種方法呢? –

    +0

    由於您沒有告訴我們您正在運行的命令,因此無法說出您需要等待完成的操作。 –

    +0

    Hi @ greg-449,基本上它在編輯器中對當前打開的程序進行代碼檢查。檢查之後,它會打開自己的視圖並顯示問題/標記。 –