I am calling the invokeAndWait from Main thread.

On Nov 18, 2013, at 2:58 PM, Mike Murray 
<ashesf...@gmail.com<mailto:ashesf...@gmail.com>>
 wrote:

This is a developer error. You can't call invoke and wait from an event method 
because invoke and wait puts your new runnable on the queue but since you are 
waiting from the queue itself it hangs. You need to comb your codebase and deal 
with this issue. These invoke methods are to be used outside the AWT dispatch 
thread.

-m


On Mon, Nov 18, 2013 at 2:51 PM, Viral Barot 
<vba...@tibco.com<mailto:vba...@tibco.com>> wrote:
Accessing AWT frame from a thread causes the application to freeze when 
executed with JRE 7. The AWT frame is created with SWT_AWT bridge.

Below is the test case in which call to frame.setVisible(true); from the AWT 
event dispatching thread does not return.

Test Case:
import java.awt.Button;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.InvocationTargetException;

import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Composite;

public class Main {

  public static void main(String[] args) {



if(System.getProperty("os.name<http://os.name/>").toLowerCase().startsWith("mac")){
SWT_AWT.embeddedFrameClass = "sun.lwawt.macosx.CViewEmbeddedFrame";
}


    Display display = new Display();
    Shell shell = new Shell(display);
    shell.setText("Shell");
    shell.setSize(200, 200);
    shell.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_BLUE));



    final Composite composite = new Composite(shell, SWT.EMBEDDED);
    GridLayout gridLayout = new GridLayout();
    gridLayout.numColumns = 1;
    composite.setLayout(gridLayout);
    composite.setSize(200,200);
    
composite.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));



    final java.awt.Frame frame  = SWT_AWT.new_Frame(composite);
frame.setVisible(false);
frame.setBackground(Color.red);
frame.setSize(200, 200);
    Button button = new Button("Submit");
    button.addActionListener(new ActionListener() {


@Override
public void actionPerformed(ActionEvent e) {


JOptionPane.showMessageDialog(null, "Hello");
}
});
    frame.add(button);
    frame.doLayout();



    try {
SwingUtilities.invokeAndWait(new Runnable() {


@Override
public void run() {
frame.setVisible(true);
}
});
} catch (InterruptedException e1) {
e1.printStackTrace();
} catch (InvocationTargetException e1) {
e1.printStackTrace();
}
    shell.open();



    while (!shell.isDisposed()) {
      if (!display.readAndDispatch())
        display.sleep();
    }
    display.dispose();



  }
}

Below is the thread dump for this.

"AWT-EventQueue-0" prio=5 tid=0x00007f8d0b087000 nid=0x8703 runnable 
[0x0000000195e40000]
   java.lang.Thread.State: RUNNABLE
at sun.lwawt.macosx.CCursorManager.nativeGetCursorPosition(Native Method)
at sun.lwawt.macosx.CCursorManager.getCursorPosition(CCursorManager.java:54)
at sun.lwawt.LWCursorManager.updateCursorImpl(LWCursorManager.java:79)
at sun.lwawt.LWCursorManager.updateCursor(LWCursorManager.java:56)
at sun.lwawt.LWComponentPeer.updateCursorImmediately(LWComponentPeer.java:852)
at java.awt.Component.updateCursorImmediately(Component.java:3123)
at java.awt.Component.show(Component.java:1626)
- locked <0x0000000160c5b8c8> (a java.awt.Component$AWTTreeLock)
at java.awt.Window.show(Window.java:1042)
at sun.awt.EmbeddedFrame.show(EmbeddedFrame.java:179)
at java.awt.Component.show(Component.java:1651)
at java.awt.Component.setVisible(Component.java:1603)
at java.awt.Window.setVisible(Window.java:1014)
at Main$2.run(Main.java:60)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:241)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at 
java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
at 
java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at 
java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at 
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

   Locked ownable synchronizers:
- None

While in the above test case if invokeLater is called instead of invokeAndWait, 
the test case runs fine. But in my application the invokeLater calls also 
freeze at same location.

This behavoir happens with SWT 3.7.2 as well as 4.3.







--
--------------------------------------------------------------------------------------
Disco Mike - Amphicoelous (Original Mix)
Now available on Beatport
Buy it now at: http://btprt.dj/WeaNGz

Reply via email to