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
}
Problema cancelando método doinbackground
5 Respostas
é… pelo visto o pessoal tem tanta ideia como resolver isso como eu… =/
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.
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’…
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.
entendi… vou ver se isso resolve meu problema…
obrigado =)