Threads

10 respostas
_

Como faço pra parar uma thread?

public void run() {
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);        
        this.setVisible(false);

        while (true) {            
            detectarBola();
            
            if (bi != null) {
              ImageIcon ii = new ImageIcon(bi);
              jlbImage.setIcon(ii);
            }
            try {
                thread.sleep(50);
                
            } catch (Exception ex) {
                ex.printStackTrace();
            } finally {
            }
            
        }
    }

 private void detectarBola() {
        try {
            bi = ImageTV.readImage();            
            if (bi != null) {
                BufferedImage biTemp = bi;
                bi = Function.copyImage(biTemp);
                dsj.setVisible(false);                                
                this.setVisible(true);                
                this.setLocation(400,400);                
                func.setBi(bi);
            }else
                this.setVisible(false);
                
        } catch (Exception ex) {            
            ex.printStackTrace();
        } finally {
        }
    }

O programa abre um vídeo.
Fica rodando até maria chegar da lenha, eu tento fechar o formulário, mas não fecha.

Alguém consegue me entender?

10 Respostas

italo.vendrameto

Vc pode usar o interrupt()

ou pode usar tb o .stop() mas esse método está Deprecated

_

italo.vendrameto:
Vc pode usar o interrupt()

ou pode usar tb o .stop() mas esse método está Deprecated

O problema é que tenho que saber se a pessoa clicou no fechar do formulário…
Entende?

kaique

Outra forma de fazer isso é deixar dentro do seu run() uma verificação para o que você deseja. Com essa verificação você pode fazer uma condição, e podendo escolher sair do método run() usando um return. Dessa forma a Thread terminará.

[]'s.

ViniGodoy

Não existe uma maneira de forçar uma thread a parar.

O ideal é que você faça como o Kaique falou, coloque no seu Runnable uma verificação. Também coloque os catchs de InterruptedException fora do seu while.

Exemplo:

public void UmaClasseParavel implements Runnable  {
   volatile boolean parado = false;

   public void run() {
       try {
          while (!Thread.isInterrupted() && !parado) {
              //Faça alguma coisa
              synchronized (this) { wait(); }
          }
       } catch (InterruptedException e) {
           //Isso garante que um interrupt possa parar a thread, 
           //mesmo num wait. A thread não parará se estiver ocupada
           //fora de um wait (por exemplo, num read de algum stream).
       }
   }

   public synchronized void parar() {
       parado = true;
       notifyAll();
    }
}

Em algum lugar do seu código você cria o Runnable e dispara ele numa thread:

UmaClasseParavel paravel = new UmaClasseParavel ();
new Thread(paravel).start();
depois, para parar a thread que está percorrendo o Runnable você faz (dentro do código do seu botão, por exemplo):
paravel.parar();
A JVM, se precisar parar o seu Runnable fará:
paravel.interrupt();

Sugestão. Deixe o interrupt para o próprio sistema, e prefira sempre criar um método seu para parar a thread. Assim você consegue identificar facilmente quando foi uma parada intencional e quando não foi.

ViniGodoy
_belinha_:
O problema é que tenho que saber se a pessoa clicou no fechar do formulário... Entende?

Para saber se uma pessoa clicou no botão de fechar de um form, adicione ao formulário um WindowListener.

Por exemplo:

public class JFrameComConfirmacao extends JFrame {
   public JFrameComConfirmacao() {
      super();
      this.setSize(800,600);

      //Primeiro, pedimos para o form não se fechar sozinho
      this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
 
      //Depois, adicionamos o WindowListener, para detectar o clique no botão de fechar
      this.addWindowListener(new WindowAdapter() {
         @Override
         public void windowClosing(WindowEvent evt) {
            if (JOptionPane.showConfirmationDialog(JFrameComConfirmacao.this, 
               "Deseja mesmo fechar") != JOptionPane.YES_OPTION)
               return; //Se responder diferente de sim, não fazemos nada

            dispose(); //Se ele respondeu sim, fechamos a janela
         }
      });
   }
}

Exemplo de uso:

JFrame frameComConfirmacao = new JFrameComConfirmacao();
frameComConfirmacao.setVisible(true);
_

if (JOptionPane.showConfirmationDialog(JFrameComConfirmacao.this,
“Deseja mesmo fechar”)
!= JOptionPane.YES_OPTION)

O que é isso?

smkk

belinha:
if (JOptionPane.showConfirmationDialog(JFrameComConfirmacao.this,
“Deseja mesmo fechar”)
!= JOptionPane.YES_OPTION)

O que é isso?

ele está perguntando para o usuário através de uma janela de confirmação (JOptionPane.showConfirmationDialog()) que retorna um valor integer dependendo das opções que você forneceu.

obs: eu disse integer… mas na comparação ele usa JOptionPane.YES_OPTION, perceba que estas são constantes para facilitar o entendimento do´
código:

parte da classe JOptionPane onde estão algumas constantes.

/** * Type meaning Look and Feel should not supply any options -- only * use the options from the <code>JOptionPane</code>. */ /** Type used for <code>showConfirmDialog</code>. */ public static final int DEFAULT_OPTION = -1; /** Type used for <code>showConfirmDialog</code>. */ public static final int YES_NO_OPTION = 0; /** Type used for <code>showConfirmDialog</code>. */ public static final int YES_NO_CANCEL_OPTION = 1; /** Type used for <code>showConfirmDialog</code>. */ public static final int OK_CANCEL_OPTION = 2;

_

Mas da erro quando eu coloco essa linha :

if (JOptionPane.showConfirmationDialog(JFrameComConfirmacao.this,
“Deseja mesmo fechar”)
!= JOptionPane.YES_OPTION)

ViniGodoy

belinha:
if (JOptionPane.showConfirmationDialog(JFrameComConfirmacao.this,
“Deseja mesmo fechar”)
!= JOptionPane.YES_OPTION)

O que é isso?

Esse trecho do código cria uma nova classe, também conhecia como inner class anônima (ou seja, uma classe dentro de outra, mas sem nome):

this.addWindowListener(new WindowAdapter() {

//Tudo que vier aqui dentro faz parte da classe filha de

//WindowAdapter que estamos criando e isso inclui o WindowClosing

}

Portanto, o “this” no método windowClosing(WindowEvent evt) vai se referir a classe do “new WindowAdapter()” e não a janela. O JOptionPane pede para você passar uma referência a janela que vai ser o “dono” da confirmação.

No entanto, há uma maneira das classes internas verem o this da classe externa. Para informar ao java que eu quero o this da janela, e não da minha classe interna, basta qualificar o this com o nome da classe JFrameComConfirmacao.this

Entendeu?

neohacker

Você fez o import da classe JOptionPane ??

Criado 16 de outubro de 2007
Ultima resposta 17 de out. de 2007
Respostas 10
Participantes 6