Re: [gui-dev] Startup deadlock problems
Jens-Uwe Mager <[email protected]> Sat, 24 Jul 2004 02:30:49 +0200
| Newsgroups | gmane.network.gnutella.limewire.gui.devel |
|---|---|
| Message-ID | <[email protected]> |
Oops, I cleaned up the patch to work properly in the case the code already runs on the event dispatcher thread. -- Jens-Uwe Mager <pgp-mailto:F476EBC2> _______________________________________________ gui-dev mailing list [email protected] http://www.limewire.org/mailman/listinfo/gui-dev
st.patch
(text/plain, 4.1 KB)
Index: com/limegroup/gnutella/gui/SplashWindow.java
===================================================================
RCS file: /cvs/gui/com/limegroup/gnutella/gui/SplashWindow.java,v
retrieving revision 1.26
diff -u -r1.26 SplashWindow.java
--- com/limegroup/gnutella/gui/SplashWindow.java 10 Jun 2004 19:11:11 -0000 1.26
+++ com/limegroup/gnutella/gui/SplashWindow.java 24 Jul 2004 00:16:18 -0000
@@ -1,6 +1,7 @@
package com.limegroup.gnutella.gui;
import com.limegroup.gnutella.settings.ThemeFileHandler;
+import com.limegroup.gnutella.ErrorService;
import javax.swing.*;
import java.awt.*;
@@ -59,8 +60,12 @@
*
* @param text the text to display
*/
- static void setStatusText(String text) {
- GLASS_PANE.setText(text);
+ static void setStatusText(final String text) {
+ GUIMediator.safeInvokeAndWait(new Runnable() {
+ public void run() {
+ GLASS_PANE.setText(text);
+ }
+ });
}
}
Index: com/limegroup/gnutella/gui/StatusLine.java
===================================================================
RCS file: /cvs/gui/com/limegroup/gnutella/gui/StatusLine.java,v
retrieving revision 1.90
diff -u -r1.90 StatusLine.java
--- com/limegroup/gnutella/gui/StatusLine.java 23 Jul 2004 22:29:59 -0000 1.90
+++ com/limegroup/gnutella/gui/StatusLine.java 24 Jul 2004 00:16:18 -0000
@@ -4,6 +4,7 @@
import java.awt.*;
import javax.swing.*;
import com.limegroup.gnutella.util.CommonUtils;
+import com.limegroup.gnutella.ErrorService;
import com.limegroup.gnutella.gui.mp3.*;
import com.limegroup.gnutella.settings.*;
@@ -160,10 +161,14 @@
* Updates the status text.
*/
void setStatusText(final String text) {
- STATUS_LABEL.setText(text);
- STATUS_LABEL.invalidate();
- STATUS_LABEL.revalidate();
- STATUS_LABEL.repaint();
+ GUIMediator.safeInvokeAndWait(new Runnable() {
+ public void run() {
+ STATUS_LABEL.setText(text);
+ STATUS_LABEL.invalidate();
+ STATUS_LABEL.revalidate();
+ STATUS_LABEL.repaint();
+ }
+ });
}
/**
Index: com/limegroup/gnutella/gui/GUIMediator.java
===================================================================
RCS file: /cvs/gui/com/limegroup/gnutella/gui/GUIMediator.java,v
retrieving revision 1.137
diff -u -r1.137 GUIMediator.java
--- com/limegroup/gnutella/gui/GUIMediator.java 23 Jul 2004 22:29:59 -0000 1.137
+++ com/limegroup/gnutella/gui/GUIMediator.java 24 Jul 2004 00:16:20 -0000
@@ -2,6 +2,7 @@
import com.limegroup.gnutella.RouterService;
import com.limegroup.gnutella.bugs.BugManager;
+import com.limegroup.gnutella.ErrorService;
import com.limegroup.gnutella.gui.library.LibraryMediator;
import com.limegroup.gnutella.gui.notify.*;
import com.limegroup.gnutella.gui.options.OptionsMediator;
@@ -311,9 +318,13 @@
* @param visible specifies whether or not the application should be
* made visible or not
*/
- public static final void setAppVisible(boolean visible) {
- FRAME.setVisible(visible);
- SearchMediator.requestSearchFocus();
+ public static final void setAppVisible(final boolean visible) {
+ safeInvokeAndWait(new Runnable() {
+ public void run() {
+ FRAME.setVisible(visible);
+ SearchMediator.requestSearchFocus();
+ }
+ });
// If the app has already been made visible, don't display extra
// dialogs. We could display the pro dialog here, but it causes
@@ -2044,6 +2058,20 @@
public void doBrowseHost(String address, int port) {
MAIN_FRAME.setSelectedIndex(SEARCH_INDEX);
SearchMediator.doBrowseHost(address, port, null);
+ }
+
+ /**
+ * safely run code synchroneously in the event dispatching thread.
+ */
+ public static void safeInvokeAndWait(Runnable runnable) {
+ if (EventQueue.isDispatchThread())
+ runnable.run();
+ else
+ try {
+ SwingUtilities.invokeAndWait(runnable);
+ } catch (Exception ex) {
+ ErrorService.error(ex);
+ }
}
}