2012-03-13 76 views
0

我在使用我的搖擺器線程時遇到了一些麻煩,問題在於我取消時。基本上,我有一個開始按鈕,點擊時可以運行我的揮杆工。搖擺工恢復問題

從這裏我的揮杆工作人員做了一些小事情,但最主要的是它完成了一些長時間運行的反射調用。

我也有一個取消按鈕 - 你可能猜到取消了我的揮杆。然而,問題是我有一個我無法查明的錯誤。

在通過第一次運行中途取消應用程序之後,擺動工人完全取消,但是,如果我然後再次單擊開始,並在完成時讓它一直運行 - 線程似乎從哪裏回來了我第一次運行取消:/。我不知道爲什麼會這樣,它就像取消的線程正在恢復並實際記住狀態一樣。我知道這是因爲在我的GUI上,我有一個JLabel,它說「處理15的元素1」,然後它跳回到取消點。

public class Test 
{ 
    private SwingWorker<Object, Integer> swingworker = initiate(); 
    private void startListener() 
    { 
     start.addActionListener(new ActionListener() 
     {  
      public void actionPerformed(ActionEvent e) 
      {    
       runIt(); 
      } 
     }); 
    } 

    private void runIt() 
    { 
     try 
     { 
      if(swingworker .isDone()) 
       swingworker = getSwingWorker(); 

      swingworker.execute(); 
     } 
     catch (HeadlessException e) { } 
     catch(Exception e){LogFileWriter.log(e);} 
    } 


    private SwingWorker<Object, Integer> getSwingWorker() 
    { 
     return new SwingWorker<Object, Integer>() 
     { 
      Object o; 

      protected Object doInBackground() throws Exception 
      { 
       //do some short calcs 
       doLongCalc(); 
       return o; 
      } 

      protected void done() 
      { 
       if(!swingworker .isCancelled()) {} //chnage the gui values like enable/disable button } 
       else{}//it was cancelled so stop progress bar and stuff 

      } 
     }; 
    } 

    private void cancelListener() 
    { 
     cancel.addActionListener(new ActionListener() 
     {  
      public void actionPerformed(ActionEvent e) 
      { 

       if(swingworker.getState() == SwingWorker.StateValue.STARTED || swingworker.getState() == SwingWorker.StateValue.DONE) 
       { 
        swingworker .cancel(true); 
       } 
      } 
     }); 
    } 

    private void doLongCalc() 
    { 
     //wrap the taks in checks for cancelled or not 
     if(!swingworker.isCancelled())//do something 
     if(!swingworker.isCancelled())//do something 
     if(!swingworker.isCancelled())//do something 
     if(!swingworker.isCancelled())//do something 
    } 
} 
+1

邏輯看起來很腥(在runit中f.i.狀態檢查不完整,或者在工作人員完成後查詢外部類中定義的字段而不是這個) - 這可能導致在兩個不同的實例上作用 – kleopatra 2012-03-13 14:35:27

回答

0

我發現我並沒有真正捕捉並正確處理異常。因此,程序流程在本應停止的地方繼續進行。