Login  Register

Re: ImageJ hanging: EventQueue deadlock by PlugInFrame.setVisible(false)

Posted by Albert Cardona-2 on Feb 02, 2011; 10:13pm
URL: http://imagej.273.s1.nabble.com/ImageJ-hanging-EventQueue-deadlock-by-PlugInFrame-setVisible-false-tp3685839p3685840.html

2011/2/2 Michael Schmid <[hidden email]>:

> Hi everyone,
>
> a strange and annoying problem:
>
> I have written a PlugInFrame that displays a grid on an image as an overlay.
> It should close when the image is closed. It works well on Mac OS X 10.4
> (Java 1.5.0_19), but on Mac OS X 10.5.8 (Java 1.5.0_26) quite often ImageJ
> becomes irresponsive on closing the image (sometimes, there was no problem,
> and in a rare cases it also happened that ImageJ did not hang after closing
> the PlugInFrame, it was hanging after closing another image later.)
>
> Using debug messages to the console I found out that setVisible(false)
> causes the EventQueue first to go to a waiting state with timeout, then it
> gets blocked forever (waiting for getting into a synchronized block
> somewhere).
> ImageJ version 1.44n.
>
> Here is the relevant code:
>
> public class Grid_Measurement extends PlugInFrame implements ImageListener,
> ...
>        (many more listeners for the GUI of the panel, with buttons,
> textfields, etc.)
>
>    public void imageClosed(ImagePlus imp) {
>        if (imp==this.imp) close();   //close PlugInFrame when image gets
> closed
>    }
>
>    public void close() {
>        ImagePlus.removeImageListener(this);
>        ... remove the other listeners referring to the ImageCanvas
>        ... I don't remove the listeners for the buttons, textfields etc.
> (too many)
>        imp.setOverlay(null);
>            #debug message  (System.err.println) shows:
>            # - the current thread is "Close", priority 4 (not the
> EventQueue)
>            # - AWT-EventQueue-0 is in state RUNNABLE
>        setVisible(false);
>            #debug message shows now: AWT-EventQueue-0 is in state
> TIMED_WAITING
>        IJ.wait(2000); //see whether we can get out after a while
>            #debug message shows now: AWT-EventQueue-0 is in state BLOCKED
>        dispose();
>            #debug messages from here on don't display (dispose never gets
> finished).
>
>
> Does anyone have experience with such a situation?
> Any ideas what the EventQueue could be waiting for after setVisible(false)?
> Is there a way to debug it (maybe without too steep a learning curve for
> handling a debugger)?


You could try running the dispose on a separate run of the dispatch thread.
For example, wrap the dispose() call with:

SwingUtilities.invokeLater(new Runnable() { public void run() { dispose(); }});

Even though close() is called within the event dispatch thread, likely
the above will likely prevent the locking. Don't ask me why, it's
empirical.

Albert

--
http://albert.rierol.net