Frage

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();
    }
}
War es hilfreich?

Lösung 3

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

Andere Tipps

  • 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.

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
        }
   });
 }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top