2012-03-13 71 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

我发现我并没有真正捕捉并正确处理异常。因此,程序流程在本应停止的地方继续进行。