diferencia - system.exit java ejemplos
"Javaw.exe" no se cerrará después de System.exit(0) (3)
Creo que encontré el punto problemático El problema parece aparecer en "grabber.start ();" línea. (Debido a que al comentar esa línea, todo salió bien. Es un problema que muestra la biblioteca de openCV. Así que supongo que no será tan fácil deshacerse de este problema.
Gracias a todos por el esfuerzo.
Editado: [ENCONTRÉ LA SOLUCIÓN]
Parece que tienen la clase OpenCVFrameGrabber implementada la interfaz Thread Runnable, por lo tanto, el objeto creado por esta clase posteriormente se ejecuta como un hilo. (No es lo mismo) Entonces, de todos modos, como una solución a este problema, primero lancé el capturador:
public Test() {
//canvas.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
canvas.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.out.println("/nClosing it.");
try {
//if (grabber != null)
grabber.release();
//grabber.stop();
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.exit(0);
}
});
}
Estoy escribiendo este programa Java en el que tengo un JFrame y un Thread. Todo va bien, excepto cuando hago clic en el botón ''X'' para cerrar el programa, el programa se cierra (el marco y sus recursos se destruyen), pero el proceso "javaw.exe" no termina. Tengo que terminar eso manualmente todo el tiempo.
Intenté por supuesto setDefaultCloseOperation (JFrame. * EXIT_ON_CLOSE *), incluso intenté con awt window listener con System.exit (0) en él, pero todavía no tuve éxito.
¿Alguna idea para ayudar?
Este es mi código [Necesita JavaCV para instalarse en su máquina]
class MyGrabber implements Runnable {
final int INTERVAL = 1000;// /you may use interval
IplImage image;
CanvasFrame frame = new CanvasFrame("Web Cam");
public MyGrabber() {
frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
}
@Override
public void run() {
FrameGrabber grabber = new OpenCVFrameGrabber(0); // 1 for next camera
int i = 0;
try {
grabber.start();
while (true) {
image = grabber.grab();
if (image != null) {
cvSaveImage("test.jpg", image);
// show image on window
frame.showImage(image);
}
Thread.sleep(INTERVAL);
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (com.googlecode.javacv.FrameGrabber.Exception e) {
e.printStackTrace();
}
}
}
public class TestGrabber {
public static void main(String[] args) {
MyGrabber gs = new MyGrabber();
Thread th = new Thread(gs);
th.start();
}
}
Recuerda esto,
The JVM will terminate only and only when
All the Non-Daemon threads including the main thread has terminated.
You can try System.exit(0) on the main thread, which runs the main method.
Intenta crear una clase que amplíe JFrame
, y luego coloca
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
en su constructor
y sí ... en su método principal donde hace que su marco sea visible, use la EventQueue ...
P.ej:
public static void main(String[] args){
EventQueue.invokeLater(new Runnable(){
public void run(){
myframe.setVisible
}
});
}
- Salga de su programa (usando System.exit () o JFrame.EXIT_ON_CLOSE)
- Diríjase al administrador de tareas y observe la identificación del proceso (pid)
- Abra una ventana de terminal y
cd c:/<path>/java/bin
(reemplace<path>
con su instalación de Java) - Use
jstack <pid> | more
jstack <pid> | more
. Reemplace<pid>
con la identificación del proceso del administrador de tareas.
Mire los hilos que no están marcados como "daemon". Habrá al menos un hilo de este tipo que se cuelga y tiene el controlador de apagado en el seguimiento de la pila.