2012-06-11 76 views
0

我试图通过改变totalWork来创建ProgressMonitor。 让我们假设我有2个步骤。第一步是检索对象列表。 totalWork = -1(UNKNOWN)。创建动态更改ProgressMonitor

在第二步中,我更改lisl中的每个对象。所以我想将totalWork更改为列表的大小。我试过类似下面的代码,但它没有工作:

int totalWork = -1 
monitor.beginTask("Task", totalWork); 
monitor.subTask("Start Subtask 1"); 
final List<Object> list = retrieveList(); 
totalWork = list.size(); 
monitor.subTask("Retrieve Events"); 
for(Object obj:list){ 
    //do some job 
    monitor.worked(1) 
} 
monitor.done() 

有没有办法实现这一目标?

编辑:我扩展作业和上面的代码是在运行方法。

+0

http://help.eclipse.org/helios/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fjface%2Fdialogs%2FProgressMonitorDialog.html –

回答

0

简答:不!

较长的答案:

如果第一步需要不到100毫秒(即使是非常大的数据集),那么这通常beginTask之前完成...

在许多情况下,将在初始计数操作需要的时间与实际操作非常相似。在这种情况下,您可以使用嵌入式SubProgressMonitor。可以说最初的计数需要1/20的后期操作:

public void run(IProgressMonitor monitor) { 
    monitor.beginTask("Task", 1+20); 
    try { 
     monitor.subTask("Initializing"); 
     final List<Object> list = retrieveList(); 
     monitor.worked(1); 

     IProgressMonitor sub = new SubProgressMonitor(monitor, 20); 
     sub.beginTask("", list.size()); 
     for (Object o : list) { 
      sub.subTask(""+o); 
      // ... 
      sub.worked(1); 
     } 
     sub.done(); 
    } finally { 
     monitor.done(); 
    } 
} 
+0

那么问题是,我不知道需要多长时间(从数据库读取信息),但超过2-3秒。第二步是采取更多,这就是为什么我需要显示进展。我找到了另一个解决方案:我运行了2次monitor.beginTask。第一次通过-1 totalWork(Unknown)从数据库中读取对象,第二次用totalWork =列表的大小读取对象。 – aphex

+1

不要为同一进程监视器多次调用'beginTask(...)'......有几个实现将会失败。有关详细信息,请参阅http://www.eclipse.org/articles/Article-Progress-Monitors/article.html ... –

+0

哪里可以获得'IProgressMonitor'库/ jar/etc? – AJMansfield

1

我找到了解决我的问题。

int totalWork = -1 
monitor.beginTask("Task 1", totalWork); 
monitor.subTask("Start Subtask 1"); 
final List<Object> list = retrieveList(); 
totalWork = list.size(); 
monitor.beginTask("Retrieve Events",totalWork); 
for(Object obj:list){ 
    //do some job 
    monitor.worked(1) 
} 
monitor.done()