- From: Antoine Dutot <antoine.dutot AT gmail.com>
- To: graphstream-users AT litislab.fr
- Subject: Re: How to use GraphicGraph
- Date: Tue, 2 Aug 2011 14:09:56 +0200
Hi,
Indeed, you will get the xyz values back from the viewer by putting
the graph as sink of the viewer's graphic graph, however, as they are
not in the same thread, you can get a lot of weird problems. To avoid
this, you can use a special pipe dedicated to the inter-thread
communication (this way, with your many CPU cores, the display runs
aside of your aglorithm :-)).
The viewer already uses such a pipe in the direction graph -> viewer,
all you have to do is to close the loop in the direction viewer ->
graph. However there is one problem : it will be necessary to look if
some events occurred in the viewer "actively" by "pumping" events from
the pipe. If your algorithm runs in a loop, you can do this in this
loop, else before using the graph, you can ask to "pump" all events
and apply them to the graph. The system used is a simple "mailbox" of
events, one thread (the viewer) sends the events in the mailbox, and
your thread will read the events when it can.
Something like this should work:
Viewer viewer = graph.display(); // As usual.
ViewerPipe pipe = viewer.newViewerPipe(); // Create a special pipe
that acts as a mailbox for events from the viewer.
pipe.addSink(graph); // Indeed addAttributeSink(graph) could be
enough, since you are only interested in "xyz" attributes
while( in your aglorithm ) {
...
pipe.pumpEvents(); // Apply all buffered events coming from the
viewer to the graph, by emptying the mail box in a thread safe way.
...
// You can use the the "xyz" attributes.
}
In fact the ViewerPipe is a special ThreadProxyPipe that will allow
more features, the ThreadProxyPipe is the real mailbox mechanism used
to cross the thread boundary.
Hope this helps,
Cheers,
Antoine
2011/8/2 Stefan Balev
<stefan.balev AT gmail.com>:
>
Hello,
>
>
I have an application that dynamically recomputes the coordinates of the
>
nodes of a graph :
>
>
Graph g = ...
>
g.display(false);
>
new Steiner(g).compute();
>
>
At the beginning I naively thought that when the user drags a node in the
>
viewer, this will change the "xyz" attribute of the node in g. Then I
>
realized that dragging a node actually changes the "xyz" attribute of the
>
node in the GraphicGraph associated to the viewer. In order to have the
>
coordinate changes back to g I tried something like this:
>
>
Graph g = ...
>
g.display(false).getGraphicGraph().addSink(g);
>
new Steiner(g).compute();
>
>
Now almost everything works fine, but sometimes I have random exceptions
>
like this:
>
>
Exception in thread "AWT-EventQueue-0" java.util.NoSuchElementException
>
at java.util.LinkedList.remove(LinkedList.java:788)
>
at java.util.LinkedList.removeFirst(LinkedList.java:134)
>
at java.util.LinkedList.remove(LinkedList.java:481)
>
at org.graphstream.stream.SourceBase.manageEvents(SourceBase.java:837)
>
[ ... stack trace too long to paste it entirely ... ]
>
at
>
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
>
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
>
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
>
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
>
>
Is it because of the "Caution : Use the returned graph only in the Swing
>
thread !!" warning that we can read in Javadoc of getGraphicGraph()? If yes,
>
what is the easiest proper way to do what I am trying to? Thanks for your
>
help.
>
>
Btw, everything works great when I use FileSinkImages. Here is a small video
>
showing this.
>
>
Best,
>
>
--
>
Stefan
>
>
Archives gérées par MHonArc 2.6.16.