[kepler-dev] Found simple fix was Re: Splash screen and corresponding changes

Christopher Brooks cxh at eecs.berkeley.edu
Tue Feb 14 09:55:43 PST 2006


Hi Kevin
Sorry, we don't have particular test cases.

You could try running the demo in $PTII/demo, which starts up multiple
vergil processes.

I'm afraid I don't have the time to do a detailed analysis before I
go.  Sorry.  This is sort of lame on my part, but other tasks call.

_Christopher

--------

    Christopher,
    
    These changes are perhaps quite a bit safer since they indeed put the
    gui parts in invokeLater.  The two calls I refer to are the display of
    the documentation effigy and the createPrimaryTableau() calls.  Both of
    these methods are pretty heavy and do cause the Splash to become
    non-responsive.
    
    Without great analysis of where pack(), or show() or setVisible(true) is
    first called in the various tableau classes, I don't know how much finer
    grained we can get.  My gut feeling is
    Configuration.createPrimaryTableau() should really call Tableau.show()
    only in the event handler thread.  But that would be a much deeper
    change than I am comfortable with.
    
    Do you have any bug reports or test cases which were fixed by placing
    VergilApplication(String[]) in invokeLater()?  That would help me out.
    
    Kevin
    
    
    *** ../ptII/ptolemy/vergil/VergilApplication.java    Mon Feb 13 08:57:11
    2006
    --- src/exp/ptolemy/vergil/VergilApplication.java    Tue Feb 14 11:39:40
    2006
    ***************
    *** 45,50 ****
    --- 45,51 ----
      import ptolemy.actor.gui.PtolemyPreferences;
      import ptolemy.data.expr.Parameter;
      import ptolemy.gui.GraphicalMessageHandler;
    + import ptolemy.gui.SwingWorker;
      import ptolemy.kernel.CompositeEntity;
      import ptolemy.kernel.attributes.URIAttribute;
      import ptolemy.kernel.util.ChangeRequest;
    ***************
    *** 139,161 ****
              // weird things happens at the user interface level.  This
              // seems to prevent occasional errors rending HTML under Web
    Start.
              try {
    !             // NOTE: This is unfortunate... It would be nice
    !             // if this could be run inside a PtolemyThread, since
    !             // getting read access the workspace is much more efficient
    !             // in PtolemyThread.
    !             SwingUtilities.invokeLater(new Runnable() {
    !                 public void run() {
                          try {
    !                         new VergilApplication(args);
                          } catch (Throwable throwable) {
                              System.err.println("xxxxxxxxxxxxxxxxxxxx");
     
                              // If we get an Error or and Exception while
                              // configuring, we will end up here.
                              _errorAndExit("Command failed", args, throwable);
                          }
                      }
    !             });
              } catch (Throwable throwable2) {
                  // We are not likely to get here, but just to be safe
                  // we try to print the error message and display it in a
    --- 140,160 ----
              // weird things happens at the user interface level.  This
              // seems to prevent occasional errors rending HTML under Web
    Start.
              try {
    !             SwingWorker w = new SwingWorker() {
    !                 public Object construct() {
                          try {
    !                     return new VergilApplication(args);
                          } catch (Throwable throwable) {
                              System.err.println("xxxxxxxxxxxxxxxxxxxx");
     
                              // If we get an Error or and Exception while
                              // configuring, we will end up here.
                              _errorAndExit("Command failed", args, throwable);
    +                         return null;
                          }
                      }
    !             };
    !             w.start();
              } catch (Throwable throwable2) {
                  // We are not likely to get here, but just to be safe
                  // we try to print the error message and display it in a
    ***************
    *** 439,445 ****
           *  @exception Exception If the configuration cannot be opened.
           */
          protected Configuration _createEmptyConfiguration() throws Exception 
   {
    !         Configuration configuration = _createDefaultConfiguration();
              URL welcomeURL = null;
              URL introURL = null;
     
    --- 438,444 ----
           *  @exception Exception If the configuration cannot be opened.
           */
          protected Configuration _createEmptyConfiguration() throws Exception 
   {
    !         final Configuration configuration = _createDefaultConfiguration()
   ;
              URL welcomeURL = null;
              URL introURL = null;
     
    ***************
    *** 449,456 ****
                  new PtolemyEffigy.Factory(directory,
                          directory.uniqueName("ptolemyEffigy"));
                     
    !         Effigy effigy = factory.createEffigy(directory, null, null);
              configuration.createPrimaryTableau(effigy);
     
              try {
                  // First, we see if we can find the welcome window by
    --- 448,459 ----
                  new PtolemyEffigy.Factory(directory,
                          directory.uniqueName("ptolemyEffigy"));
                     
    !         final Effigy effigy = factory.createEffigy(directory, null, null)
   ;
    !         SwingUtilities.invokeLater( new Runnable() {
    !             public void run() {
                      configuration.createPrimaryTableau(effigy);
    +             }
    +         });
     
              try {
                  // First, we see if we can find the welcome window by
    ***************
    *** 483,491 ****
                  _parser.parse(welcomeURL, welcomeURL);
              }
     
    !         Effigy doc = (Effigy) configuration.getEntity("directory.doc");
     
    !         doc.identifier.setExpression(introURL.toExternalForm());
     
     
              return configuration;
    --- 486,507 ----
                  _parser.parse(welcomeURL, welcomeURL);
              }
     
    !         final Effigy doc = (Effigy)
    configuration.getEntity("directory.doc");
     
    !         /* Need to have a final variable to hold the introURL in order
    !          * to use in an anonymous class.
    !          */
    !         final URL finalIntroURL = introURL;
    !         SwingUtilities.invokeLater( new Runnable() {
    !             public void run() {
    !                 try {
    !                    
    doc.identifier.setExpression(finalIntroURL.toExternalForm());
    !                 }
    !                 catch( IllegalActionException ex ) {
    !                     /* Not certain what to do with this here */
    !                 }
    !             }
    !         });
     
     
              return configuration;
    
    
--------


More information about the Kepler-dev mailing list