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();
    }
}
Emil
  • 555
  • 3
  • 7
  • 16
  • 3
    You may need to give us more information. If you don't get a decent solution soon, consider creating and posting an [SSCCE](http://SSCCE.org). – Hovercraft Full Of Eels Jun 09 '12 at 11:42
  • More information? Like what? What is not understandable? – Emil Jun 09 '12 at 11:48
  • 2
    I don't understand what is causing your current problem, and fear that this is because the code you've posted has nothing to do with the current problem. If I take your code posted above, massage it so that it compiles and runs, it does not reproduce the problem. So it means to me that the problem probably lies elsewhere in code not shown. We won't have the time or inclination to review all of your code, but if this were my project, I'd try winnowing down the code to the minimal compilable and runnable code that does in fact demonstrate the problem. Then I'd post it here. – Hovercraft Full Of Eels Jun 09 '12 at 11:50
  • 1
    I have a feeling that you've got a non-daemon thread that you've started somewhere, although I thought that `System.ext(...)` should stop even these, and so I remain confused as ever. – Hovercraft Full Of Eels Jun 09 '12 at 11:58
  • 2
    You have a thread registered as shutdown hook, and always if you have an issue consider using jstack. If I process refuses to 'exit' most likely it is stuck in shutdown hook, no code needed actually. – bestsss Jun 09 '12 at 12:13
  • please provide full implementation of run - i suppose problem there. – popfalushi Jun 09 '12 at 12:14
  • I placed the whole code. – Emil Jun 09 '12 at 14:02
  • So? No solution for this problem?? – Emil Jun 09 '12 at 14:38

3 Answers3

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
        }
   });
 }
Radu Murzea
  • 10,724
  • 10
  • 47
  • 69
Kumar Vivek Mitra
  • 33,294
  • 6
  • 48
  • 75
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.

Hendrik Brummermann
  • 8,242
  • 3
  • 31
  • 55
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);
        }
    });
}
Emil
  • 555
  • 3
  • 7
  • 16
  • 1
    You shouldn't access a FrameGrabber from different threads, it's not guaranteed to be thread safe. You should call grabber.stop()/release() from the same thread that you called start() and grab() from. Then the process should exit properly. – Samuel Audet Jun 10 '12 at 04:54