Проблема с возобновлением работы свингера - PullRequest
0 голосов
/ 13 марта 2012

У меня возникли проблемы с темой моего рабочего качания, и проблема в том, когда я отменяю.По сути, у меня есть кнопка запуска, которая при нажатии запускает мой рабочий.

Отсюда мой качельщик делает несколько небольших вещей, но главное, что он выполняет некоторые длительные вызовы рефлексии.

У меня также есть кнопка отмены, которая, как вы, наверное, догадались, отменяет мой рабочий.Однако проблема в том, что у меня есть ошибка, которую я просто не могу точно определить.

После отмены приложения в середине его первого запуска, рабочий Swing отменяет все отлично, однако, если я затем нажимаю кнопку «Пуск» снова и позволяю ему запускаться до конца, когда он завершает работу - поток, похоже, возобновляет работу.откуда я отменил при первом запуске: /.Я понятия не имею, почему это так, и это выглядит так, как будто отмененный поток возобновляет и фактически запоминает состояние.Я знаю, что это происходит, потому что на моем графическом интерфейсе у меня есть JLabel, который говорит «элемент обработки 1 из 15 ...», и он возвращается к отмененной точке.

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
    }
}

Ответы [ 2 ]

2 голосов
/ 13 марта 2012

Swingworker предназначен для выполнения один раз, вы можете посмотреть на следующий пост Как отменить выполнение SwingWorker?

Это может решить вашу проблему, или вы найдете ответ.

0 голосов
/ 13 марта 2012

Я обнаружил, что на самом деле я не ловлю и не имею дело с исключением правильно. Таким образом, поток программы продолжался там, где он должен был остановиться.

...