【问题标题】:Update IProgressMonitor in IStatusLineManager after each worked()每次工作后更新 IStatusLineManager 中的 IProgressMonitor()
【发布时间】:2016-05-13 15:38:06
【问题描述】:

我正在尝试使用 IProgressMonitor,但是当我运行我的代码时,我没有看到任何事情发生。如果我消除 pm.done();我可以看到进度监视器填满然后呆在那里。有没有办法在每次 pm.worked() 调用后刷新 UI,即使我必须暂停当前线程。

public void someMethod(CutomerInfo cInfo) {

    IStatusLineManager lm = getViewSite().getActionBars().getStatusLineManager();
    IProgressMonitor pm = lm.getProgressMonitor();
    pm.beginTask("Doing some work",  100);

    populateCustomerInfo();
    pm.worked(25);

    someOtherFunction();
    pm.worked(25);

    morefunctions();
    pm.worked(25);

    this.someValue = someClass.yetAnotherFunction(this.cInfo, this);
    pm.worked(25);

    pm.done();
}

编辑 1

我将 Job 添加到我的函数中,现在看起来像下面的代码。我知道作业正在运行,但我没有看到进度条。有没有办法通过我定义为 pm 的进度监视器?

public void someMethod(CutomerInfo cInfo) {

    Job job = new Job("Test Job") {

  IStatusLineManager lm = getViewSite().getActionBars().getStatusLineManager();
  IProgressMonitor pm = lm.getProgressMonitor();

  @Override
  protected IStatus run(IProgressMonitor monitor) {
            // Set total number of work units
            monitor.beginTask("start task", 100);

    try {
      System.out.println("\nHello World (from a background job)\n");

      monitor.subTask("doing a");
      populateCustomerInfo();
      monitor.worked(25);

      monitor.subTask("doing b");
      someOtherFunction();
      monitor.worked(25);

      monitor.subTask("doing c");
      morefunctions();
      monitor.worked(25);

      monitor.subTask("doing d");
      yetAnotherFunction();
      monitor.worked(25);

      monitor.done();
    }catch (InterruptedException e1) {
      e1.printStackTrace();
    }
            return Status.OK_STATUS;
        }
    };

    job.schedule();
}

【问题讨论】:

  • IStatusLineManager.getProgressManager 的 JavaDoc 说:请注意,返回的进度监视器只能从 UI 线程访问。所以我不认为你的代码实际上是在非 UI 线程中运行的。
  • 谢谢,我已经编辑了我的问题。
  • 不,您不能更改使用的进度监视器。如果您在安排作业之前在作业上调用setUser(true),则进度将显示在弹出对话框中(但仅当作业运行超过约 2 秒时)。

标签: java eclipse progress-bar jface


【解决方案1】:

长时间运行的任务必须在后台线程中运行。在 UI 线程中运行它们将阻止 UI 更新。

在这种情况下,您可能希望使用 Eclipse Job。 Job 的主要 run 方法提供了一个进度监视器,该监视器将显示在状态行中。

【讨论】:

  • 我试试看。谢谢。
  • 我添加了一个作业,但我根本看不到进度监视器。请参阅编辑 1。谢谢。
  • 作业进度通常显示在Eclipse主窗口右下角的进度区域。
猜你喜欢
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2021-03-31
  • 2015-08-20
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 2013-11-29
相关资源
最近更新 更多