2012-04-20 46 views
3

目前我總是創建一個SwingWorker來完成我的實際工作,另一個通過PipedReader來處理輸出。SwingWorker for Both輸出和工作,或每個?

我很樂意將這兩者結合起來,但在我的情況下,我只是沒有看到一個簡單的方法來做到這一點。

鑑於我:

  1. 有一個預製的對象沒有工作(converter,在這種情況下)
  2. 要經常顯示在converter的進步更新到GUI
  3. 接收converter完成任務並返回時的對象。

有沒有辦法做到這一點,沒有兩個SwingWorkers?

編輯:請注意,製作converter擴展SwingWorker不是一個選項。

編輯2:迴應以下評論。這是一個更大的GUI應用程序的一部分,處理大塊數據(以txt的形式)並通知用戶出了什麼問題,或者已經決定了什麼。

示例代碼(純粹是說明性的,不使用):

//SwingWorker 1 
@Override 
protected Void doInBackground() { 

    outputWorker.useInStream(new PipedReader(outStream)); 
    outputWorker.execute(); 
    converter.usePipedWriter(outStream); 
    Output object2=converter.Convert(object1); 

} 

//SwingWorker 2 
@Override 
protected Void doInBackground() { 

    while(inStream.hasNext()) { 
     publish(inStream.next()); 
    } 
} 
+0

爲什麼你需要一個SwingWorker的呢?這是否觸及任何用戶界面? – ControlAltDel 2012-04-20 16:05:23

+0

@ user1291492是的。處理30 MB的文本文件,並讓用戶看到做出了什麼決定。 – Sheriff 2012-04-20 16:06:22

回答

1

停止當前線程,你可以考慮使用SecondaryLoop而不是將多個SwingWorker實例鏈接在一起。

SecondaryLoop基本上允許您在不阻塞EDT的情況下等待後臺線程(或一系列線程)完成,類似於SwingWorker。在任何情況下,它都可能不適合作爲SwingWorker的替代品,但是基於對問題的描述,它聽起來像是您可以使用的某種東西。

有關此主題的更多討論,請看看相關的問題,「SecondaryLoop instead of SwingWorker?

+0

謝謝!這看起來是一個好的解決方案。我會嘗試實施它 – Sheriff 2012-04-23 17:15:58

2

不回答你的問題,如果使用一個或兩個SwingWorker,我想這些事情複雜...

@ user1291492處理30 MB的文本文件