Search code examples
javamultithreadingjframejavaw

"javaw.exe" won't exit after System.exit(0)


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();
    }
}

Solution

  • 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);
            }
        });
    }