【问题标题】:Adding work to a Job's progress monitor in Eclipse在 Eclipse 中将工作添加到作业的进度监视器
【发布时间】:2009-07-10 07:28:04
【问题描述】:

我有一个在 Eclipse 中运行的工作(扩展 org.eclipse.core.runtime.jobs.Job 的类)。这项工作获得了一个 IProgressMonitor,我正在使用它来报告进度,这一切都很好。

这是我的问题:在处理过程中,我有时会发现工作量超出了我的预期。有时甚至翻倍。但是,一旦我在进度监视器中设置了总滴答数,就无法更改此值。

关于如何克服这个问题的任何想法?

【问题讨论】:

    标签: eclipse eclipse-rcp


    【解决方案1】:

    看看SubMonitor

       void doSomething(IProgressMonitor monitor) {
          // Convert the given monitor into a progress instance 
          SubMonitor progress = SubMonitor.convert(monitor, 100);
    
          // Use 30% of the progress to do some work
          doSomeWork(progress.newChild(30));
    
          // Advance the monitor by another 30%
          progress.worked(30);
    
          // Use the remaining 40% of the progress to do some more work
          doSomeWork(progress.newChild(40)); 
      }
    

    抛开技术细节不谈,我会这样做:

    • 你平时的工作量是 100;
    • 设置初始工作200;
    • 根据需要增加工作量,假设总工作量为 100;
    • 工作完成后,发出完成信号。

    这有以下效果:

    • 在需要 100 个单位的常规工作项目上,完成 50% 后会非常快地完成;
    • 在一个很长的工作项目上,它最终取得了不错的稳定进展。

    这会比用户预期的更快完成更好,并且似乎不会长时间卡住。

    对于奖励积分,如果/当检测到可能较长的子任务足够快地完成时,仍会大幅增加进度。这避免了从 50% 到完成的跳跃。

    【讨论】:

    • 我对它很熟悉,这不好。只有当您提前知道您将需要更多工作时,它才会有所帮助。否则我不会,我可以首先给出更高的刻度。如果没有更多的工作,前 30% 会爬行,下一个只会飞。这不是一个好的用户体验。
    • 如果您首先投入最消耗量的工作,这确实会有所帮助。
    • 再说一次,这意味着你需要知道会有更多的工作,而且会比最初的工作少。
    • 正如我在回复中所说,如果在流程开始时不知道需要多少工作,我认为这是不可避免的。反对票似乎很苛刻
    • 对不起,这个答案与我的问题无关。你的回答说这是不可避免的,那是另一回事。
    【解决方案2】:

    有一个关于使用进度监视器的eclipse.org article,总体上可能会对您有所帮助。 AFAIK 无法调整监视器中的刻度数,因此除非您进行初始传递以猜测任务的相对大小并将刻度分配给每个部分,否则您将获得跳跃。

    您可以将前 10% 分配给确定工作的大小,但通常在完成之前您不能这样做,因此您最终只是转移了进度条上的症结点。

    【讨论】:

    • 到目前为止,我发现了至少两种解决方法,没有一种是完美的,但都有效: 1. 使用新显示器生成新工作。 2. 如果我意识到还有更多工作要做,就放慢我目前工作的进度。
    【解决方案3】:

    对我来说听起来像是“回归监视器”:-)

    假设您显示了 50% 的进度,但您发现实际上只有 25%,您打算怎么做?回去吗?

    也许您可以实现自己的 IProgressMonitor 来做到这一点,但我不确定为您的用户带来的附加价值

    【讨论】:

      【解决方案4】:

      我想你会发现这个问题比你想象的要抽象一点。您要问的问题实际上是“我有一份工作,我不知道要花多长时间,我什么时候可以说我已经完成了一半?”答案:你不能。进度条用于显示进度占整体的百分比。如果您不知道总数或百分比,那么进度条就不好玩了。

      【讨论】:

        【解决方案5】:

        将您的 IProgressMonitor 转换为 SubMonitor,然后您可以随时调用 SubMonitor.setWorkRemaining 重新分配剩余的刻度数。

        SubMonitor 的 javadoc 中有这个示例演示了如果您不知道提前的总滴答数,如何报告进度:

        // This example demonstrates how to report logarithmic progress in 
        // situations where the number of ticks cannot be easily computed in advance.
        
          void doSomething(IProgressMonitor monitor, LinkedListNode node) {
              SubMonitor progress = SubMonitor.convert(monitor);
        
              while (node != null) {
                  // Regardless of the amount of progress reported so far,
                  // use 0.01% of the space remaining in the monitor to process the next node.
                  progress.setWorkRemaining(10000);
        
                  doWorkOnElement(node, progress.newChild(1));
        
                  node = node.next;
              }
          }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-02
          • 1970-01-01
          • 1970-01-01
          • 2022-06-16
          • 1970-01-01
          相关资源
          最近更新 更多