I'm writing this Java program in which I have a JFrame and a Thread. Everything goes fine, except when I click the 'X' button to close the program, the program itself closes (frame and it's resources get destroyed), but the "javaw.exe" process won't end. I have to terminate that manually all the time.
I tried of course setDefaultCloseOperation(JFrame.*EXIT_ON_CLOSE*) , I even tried awt window listener with System.exit(0) in it, but still no success.
Any ideas to help?
This is the my code. [It needs JavaCV to be installed on your machine.]
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();
}
}
I think I found the problem point. The problem seems to appear at the "grabber.start();" line. (Because by commenting that line, everything went fine. It's an issue openCV library shows out. So I guess it won't be that easy getting rid of this problem.
Thanks everyone for the effort though.
Edited: [FOUND THE SOLUTION]
They seem to have the OpenCVFrameGrabber class implemented the Thread Runnable interface, thus, the object created by this class subsequently runs like a thread. (Not the same though). So anyway, as a solution to this problem, I did release the grabber first:
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);
}
});
}