4

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

3 回答 3

3

Remember this,

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.

Try creating a class which extends JFrame,and then place

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); in its constructor.

and yes.. in your main method where you make your frame visible, use the EventQueue..

Eg:

public static void main(String[] args){
   EventQueue.invokeLater(new Runnable(){

   public void run(){
         myframe.setVisible
        }
   });
 }
于 2012-06-09T13:31:14.290 回答
3
  • Exit your program (using System.exit() or JFrame.EXIT_ON_CLOSE)
  • Go to the taskmanager and note the process id (pid)
  • Open a terminal window and cd c:\<path>\java\bin (replace <path> with your Java installation)
  • Use jstack <pid> | more. Replace <pid> with the process id from task manager.

Look at the threads that are not flagged as "daemon". There will be at least one such thread which hangs and has the shutdown handler in the stack trace.

于 2012-06-09T13:56:53.940 回答
2

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);
        }
    });
}
于 2012-06-09T16:03:23.160 回答