Hi,

I have a small program that demonstrates a problem with JSVGComponent.
I run an infinite loop that alternates the loading of two SVG docs.
After running for a while, a race condition appears to cause one of
the documents to get "stuck" in the canvas; subsequent calls to
setSVGDocument seem to have no effect.  The canvas seems "alive"
insofar as responding to window resizes/redraws, but the
setSVGDocument never seems to have any effect.  I suspect that a
thread is starving in a RunnableQueue somewhere.  Perhaps this has
something to do with it:

http://koala.ilog.fr/batik/mlists/batik-dev/archives/msg03651.html

?

I've attached the sample program.  You might need to adjust the
argument to sleep for your platform.  The 400 works for me on my Linux
box.

Thanks for your attention.


-- George Armhold Rutgers University eLearning Grant, DCIS
import java.awt.*;
import javax.swing.*;
import java.io.*;

import org.w3c.dom.svg.*;
import org.apache.batik.swing.svg.*;
import org.apache.batik.dom.svg.*;
import org.apache.batik.util.XMLResourceDescriptor;


/**
 * Demonstrate a race condition in RunnableQueue/JSVGComponent.
 * Alternate two SVG documents in the JSVGComponent.  After a few
 * iterations, we seem to get "stuck" on one of the docs.
 */ 
public class CanvasTest extends JFrame {
  private JSVGComponent canvas;

  public CanvasTest()  {
    // allocate canvas
    canvas = new JSVGComponent(null, true, false);
    canvas.setDocumentState(JSVGComponent.ALWAYS_DYNAMIC);

    // allocate an XML parser
    String parser = XMLResourceDescriptor.getXMLParserClassName();
    SAXSVGDocumentFactory svgFactory = new SAXSVGDocumentFactory(parser);

    getContentPane().add(canvas);
  }

  public Dimension getPreferredSize() {
    return new Dimension(600, 500);
  }


  public void loadSlide(final SVGDocument doc) {
    if (! SwingUtilities.isEventDispatchThread())
      throw new IllegalStateException("Must be running in Swing thread.");

    System.err.println("loadSlide: " + doc.getURL());
    canvas.setSVGDocument(doc);
  }



  public static void main(final String[] args) throws Exception {
    if (args.length != 2) {
      System.err.println("Usage: java CanvasTest file1.svg file2.svg");
      System.exit(1);
    }


    final CanvasTest frame = new CanvasTest();
    frame.pack();
    frame.setVisible(true);

    String parser = XMLResourceDescriptor.getXMLParserClassName();
    SAXSVGDocumentFactory svgFactory = new SAXSVGDocumentFactory(parser);


    // parse 2 SVG documents and alternate them in the JSVGComponent
    
    File f1 = new File(args[0]);
    File f2 = new File(args[1]);

    final SVGDocument doc1 = 
      (SVGDocument) svgFactory.createDocument(f1.toURL().toString());

    final SVGDocument doc2 = 
      (SVGDocument) svgFactory.createDocument(f2.toURL().toString());

    // start with doc1
    SVGDocument doc = doc1;

    // let it spin
    while (true) {
      
      final SVGDocument finalDoc = doc;
      SwingUtilities.invokeLater(new Runnable() {
          public void run() {
            frame.loadSlide(finalDoc);
          }
        });
      
      // switch between doc1 & doc2
      if (doc == doc1) 
        doc = doc2;
      else 
        doc = doc1;
      
      try {
        Thread.sleep(400);  // you may need to tune this
      } catch (InterruptedException e) {
      }
    }
  }
}

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to