使用Job.getJobManager.IsIdle()

时间:2016-12-05 11:10:18

标签: eclipse-plugin

我正在尝试不断检查进度监视器是否有在后台运行的操作。

为此,我使用了Job.getJobManager.IsIdle()

我尝试了以下内容:

  1. 把它放在工作中。
  2.     WorkspaceJob job = new WorkspaceJob("Hello") 
        {
            @Override
            public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException
            {
                while(!Job.getJobManager().isIdle())
                {
                    System.out.println(!Job.getJobManager().isIdle());
                }
                return Status.OK_STATUS;
            }
        };
        job.setPriority(Job.SHORT);
        job.schedule();
    

    但这不起作用,因为Job.getJobManager.isIdle永远不会返回false,因为Job 'Hello'正在运行。

    1. 将其置于异步线程中。

      new Thread(new Runnable()
          {
              @Override
              public void run()
              {
                  Display.getDefault().asyncExec(new Runnable()
                  {
                      @Override
                      public void run()
                      {
                          while(!Job.getJobManager().isIdle())
                          {
                              System.out.println("hi");
                          }
                      }
                  });
              }
          }).start();
      
    2. 但这不起作用,因为这会冻结主Eclipse GUI,阻止其他进程(如果有任何进程)完成。

      如果有人有关于如何做的建议或任何意见,那就太棒了!

1 个答案:

答案 0 :(得分:1)

您可以使用作业更改侦听器IJobChangeListener来侦听作业状态的所有更改。您可以在侦听器中的适当位置测试空闲。 尝试循环调用isIdle

您可以使用JobChangeAdapter类提供IJobChangeListener方法的默认实现,这样您只需要覆盖您感兴趣的事件,可能只是done方法:< / p>

Job.getJobManager().addJobChangeListener(new JobChangeAdapter()
  {
    @Override
    public void done(IJobChangeEvent event)
    {
      if (Job.getJobManager().isIdle() {
        // Manager is idle
      }
    }
  });