Aplicação sai, mas o processo ainda roda :-)

11 respostas
gustavo.moda

Amigos,

To ficando doido!

Olha so.

main que chama um frame; e depois esse frame é fechado e aberto outro.
No ultimo Jframe existe o comando para finalizar a aplicação.

System.exit(0);

O Jframe finaliza mas a aplicação não.

Esse comportamento ocorre mesmo quando Tesystem.exit(0) é executado em qq parte da aplicaçào o processo dela não é fechado.
Quando ocorre um bug tenho que matar o processo do windows.

Alguma ideia ? Alguem ja passou por isso?

11 Respostas

robinsonbsilva

ao abrir frames são criados threads para ele, e essas ficam individualizadas.
No seu caso, seria melhor trabalhar com aplicação tipo MDI, assim ao finaliza-la ele mataria todas “filhas”

sergiotaborda

gustavo.moda:
Amigos,

To ficando doido!

Olha so.

main que chama um frame; e depois esse frame é fechado e aberto outro.
No ultimo Jframe existe o comando para finalizar a aplicação.

System.exit(0);

O Jframe finaliza mas a aplicação não.

Esse comportamento ocorre mesmo quando Tesystem.exit(0) é executado em qq parte da aplicaçào o processo dela não é fechado.
Quando ocorre um bug tenho que matar o processo do windows.

O processo so termina quando a JVM termina. A JVM só termina quando todas as Threads não-deamon terminam.
Vc tem alguma thread não-deamon na sua aplicação ? (pergunta capciosa)

gustavo.moda

:smiley:
Sim!
Veja.

SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				LoginJFrame frameLogin = new LoginJFrame(app);   
			}
		});

E o LoginJFrame, faz um dispose e um show no root (app)

sergiotaborda

Sim!
Veja.

SwingUtilities.invokeLater(new Runnable() {
				public void run() {
					LoginJFrame frameLogin = new LoginJFrame(app);   
				}
			});

E o LoginJFrame, faz um dispose e um show no root (app)
[/quote]

Use a tag code para formatar o codigo no forum.
Vc não precisa do invoke later, precisa ?

gustavo.moda

[quote=sergiotaborda]

gustavo.moda:
:smiley:
Use a tag code para formatar o codigo no forum.
Vc não precisa do invoke later, precisa ?

Sempre esqueco dessa tag… :slight_smile: Não esquecerei mais.

Retirado o invoke…

Bom, matar o frame seria dispose, certo? Mara a daemon dele?

E

Mas usa aplicação tem vários frames?
Já tentou usar JInternalFrame? Com ele vc desenvolve em de um cima de um frame apenas.

http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JInternalFrame.html

Att.

gustavo.moda

eduardocsanto:
Mas usa aplicação tem vários frames?
Já tentou usar JInternalFrame? Com ele vc desenvolve em de um cima de um frame apenas.

http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JInternalFrame.html

Att.

Não, temos frames.

Um faz o splah de inicializacao e o principal.
Porem, no principal, todos os comandos faco com Runnable (thread). Mas no final da thread igualo a null, ou seja, mato ela.

gustavo.moda

eduardocsanto:
Mas usa aplicação tem vários frames?
Já tentou usar JInternalFrame? Com ele vc desenvolve em de um cima de um frame apenas.

http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JInternalFrame.html

Att.

Mudei para internal e ela não morre.

Estou embarcando o firebird.
Ja deu um Hibernate Shutdown e nada.
To achando que esse caboclo que nào morre.

sergiotaborda

gustavo.moda:
eduardocsanto:
Mas usa aplicação tem vários frames?
Já tentou usar JInternalFrame? Com ele vc desenvolve em de um cima de um frame apenas.

http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JInternalFrame.html

Att.

Não, temos frames.

Um faz o splah de inicializacao e o principal.
Porem, no principal, todos os comandos faco com Runnable (thread). Mas no final da thread igualo a null, ou seja, mato ela.

Não. Igualar a variável que referencia um objeto thread NÂO mata a thread.

O Swing têm a sua própria thread. Para terminar a thread do swing vc precisa esconder todos os objetos swing existentes.
Vc pode dar um dispose neles, mas se não der um setVisible(false) antes, o dispose não funciona.

Moral da historia: antes de fazer System.exist() certifique-se que todos os frames estão fechados. Fechados significa setVisible(false)

E

Nessas threads que tu dispara não tem nenhuma que fica esperando resposta de algum lugar … ?
Por isso ela fica em memória, ou melhor, uma thread troca mensagens com a outra? Uma não pode estar esperando a outra, por isso o processo fica preso?

gustavo.moda

eduardocsanto:
Nessas threads que tu dispara não tem nenhuma que fica esperando resposta de algum lugar … ?
Por isso ela fica em memória, ou melhor, uma thread troca mensagens com a outra? Uma não pode estar esperando a outra, por isso o processo fica preso?

Não tem. Todas encerra o processo.
Ja fiz teste de somente abrir o JFRAME e sair, tem processo rodando.

Criado 16 de julho de 2008
Ultima resposta 17 de jul. de 2008
Respostas 11
Participantes 4