Problema cancelando método doinbackground

5 respostas
L
Oi pessoal, faz um bom tempo que estou com esse problema, já tentei entender e nada. Meu projeto tem uma GUI e implementei swingworker. Aí coloquei um botão 'Abortar!', mas não está funcionando. Eu clico no botão, mas depois de alguns segundos o programa retorna como se nada tivesse acontecido. O programa até imprime o "Cancelou!"! Vou trazer o código:
public class VygerGUI extends javax.swing.JFrame {
//...
private static Executar exec;
//declaracoes
public VygerGUI() {
init components;
//...
}
protected class Executar extends SwingWorker<Void, Void> {

            @Override
            public Void doInBackground() throws Exception {
//...
//faço tudo... (usando outras classes)
        }
}

//aí tem os métodos que o netbeans mesmo cria pra tratar eventos

    private void jButtonCalcularMouseClicked(java.awt.event.MouseEvent evt) {                                             
        // TODO add your handling code here:
        jButtonAbortar.setVisible(true);
        exec = new Executar();
        try {
            exec.execute();
        } catch (Exception ex) {
            Logger.getLogger(VygerGUI.class.getName()).log(Level.SEVERE, null, ex);
        }
    } 

private void jButtonAbortar1MouseClicked(java.awt.event.MouseEvent evt) {                                             
            // TODO add your handling code here:
            exec.cancel(true);
            jButtonAbortar1.setVisible(false);
            if(exec.isCancelled()) System.out.println("Cancelou!!");
        }   
public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new VygerGUI().setVisible(true);
            }
        });
    }
//...
// algumas declarações de componentes da GUI
}
Obrigado pela ajuda pessoal.. Se alguem tiver ideia de porque não está funcionando, agradeço imensamente! Abraços.

5 Respostas

L

é… pelo visto o pessoal tem tanta ideia como resolver isso como eu… =/

T

Quando você dá um cancel (true), ele tenta usar o método “interrupt” da classe Thread. Como você deve saber, ele provoca a emissão de uma exceção InterruptedException em algumas partes dessa thread; o problema é que nem sempre é possível interromper uma thread só com essa exceção InterruptedException. Em particular, você não consegue interromper uma cópia de arquivos com Thread.interrupt no Windows, por exemplo.

L

entendo…
e tem algo que se possa fazer a respeito? porque a priori, embora o programa tenha muitas classes e métodos, apenas um deles corresponde a mais de 70% do tempo de execução… se não tiver jeito de abortar com esse método sendo executado, nem adianta criar o botão ‘abortar’…

T

Se você puder pôr várias verificações de um flag dentro desse tal método demorado, é mais seguro.

/// Processamento demorado
for (int i = 0; i < 100000; ++i) {
    if (abortar) {
        // fazer alguma coisa para deixar tudo limpinho antes de sair. 
        break;
   }
   // prosseguir com o processamento...
}

Você nem precisaria usar "cancel"; você só setaria o tal flag.

L

entendi… vou ver se isso resolve meu problema…
obrigado =)

Criado 4 de abril de 2009
Ultima resposta 6 de abr. de 2009
Respostas 5
Participantes 2