2016-12-01 66 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,基本上它在编辑器中对当前打开的程序进行代码检查。检查之后,它会打开自己的视图并显示问题/标记。 –