2012-06-11 102 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()