Ich habe ein einfaches Programm, das verteilte Umgebung simuliert. Ich möchte das Prozessorverhalten mithilfe der GraphStream-Bibliothek visualisieren. Jeder Prozessor ist ein Thread, sie einige Berechnungen zu tun, aber nicht die ganze Zeit, nur dann, wenn ich die switch
VariableVisualisierung des Graphen
while(running){
if(switch)
computate();
}
Ich habe eine Klasse geschrieben, den processorList nehmen und Graphvisualisierung vorzubereiten. Es gibt eine Funktion für diese Aufgabe
public void adjustBFSGraph2(){
for(Edge e: this.g.getEdgeSet())
{
e.clearAttributes();
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for(Processor p : processorList)
{
p.getNode().setAttribute("ui.label", "Pid" +" " + p.getPID() +" "+"Dist: " + p.getFieldValue("bfs") + " " + "Parent" + " " + p.getFieldValue("parent"));
if(!p.getFieldValue("parent").equals("-1"))
{
Edge e = p.getNode().getEdgeBetween(p.getFieldValue("parent"));
if(e != null)
{
e.setAttribute("ui.color", p.getColor());
e.setAttribute("ui.label", "added" + p.getPID());
}
}
}
}
Mein Problem ist, dass ich Farben auf Kanten nur für Blinzeln des Auges und dann Farbe disapear sehen. Es sieht so aus, als ob es das Attribut "ui.color"
hinzufügt und es in der gleichen Schleife entfernt, aber wie ist es möglich? @update Ich habe meinen Code bearbeitet, jetzt kann ich sehen, Kanten für die Zeit in thread.sleep()
nach der ersten Schleife, gut, ich verstehe nicht, warum nach dem Löschen aller Attribute kann ich sie tatsächlich sehen. hier ist, wie ich meine Funktion
while(true)
{ i++;
//if any processor is not runing
boolean aux = false;
while(!aux) {
for (Processor proc : s.processorList) {
aux = aux || proc.isEnabled();
}
aux = !aux;
}
s.gp.adjustBFSGraph();
Thread.sleep(5000);
for(Processor proc: s.processorList)
{
proc.enable();
}
}
Wenn Thread.sleep()
innerhalb Funktion einstellen, um weniger als 100 ms gesetzt, es wieder zu blinken beginnt.
Weil es ein wenig unklar sein kann, was ich tue ich kleinere Beispiel erstellt haben
Dies entspricht meiner Prozessorklasse
public class SomeObjectWithNode {
public Node n;
public Color c;
public SomeObjectWithNode(Node n)
{
Random rand = new Random();
float r = rand.nextFloat();
float g = rand.nextFloat();
float b = rand.nextFloat();
Color randomColor = new Color(r, g, b);
c = randomColor;
this.n = n;
}
}
Hier ist eine Klasse Hexe Änderung Graph Styling/es Zeichnung
public class TestDraw {
Vector<SomeObjectWithNode> n;
Graph g;
public TestDraw(Vector<SomeObjectWithNode> k, Graph g)
{
this.g= g;
this.n = k;
}
public void adjust()
{
Random rand = new Random();
for(Edge e: g.getEdgeSet())
{
e.clearAttributes();
}
for(SomeObjectWithNode k: n)
{
k.n.addAttribute("ui.color", k.c);
for(Edge e: k.n.getEdgeSet())
{
float r = rand.nextFloat();
float g = rand.nextFloat();
float b = rand.nextFloat();
Color randomColor = new Color(r, g, b);
e.addAttribute("ui.color", randomColor);
}
}
}
}
und hier ist Hauptklasse
public class TestGs {
public static void main(String[] args) {
Node lastNode;
TestDraw t;
Vector<SomeObjectWithNode> a = new Vector<SomeObjectWithNode>();
System.setProperty("gs.ui.renderer", "org.graphstream.ui.j2dviewer.J2DGraphRenderer");
Graph g = new SingleGraph("test1");
g.display();
g.addAttribute("ui.stylesheet", "node { fill-mode: dyn-plain; size: 10px;} edge { fill-mode: dyn-plain; size: 2px;}");
a.add(new SomeObjectWithNode(g.addNode(Integer.toString(0))));
lastNode = g.getNode("0");
for(int i = 1; i < 10; i++)
{
a.add(new SomeObjectWithNode(g.addNode(Integer.toString(i))));
g.addEdge(Integer.toString(i-1).concat(Integer.toString(i)), a.get(i).n, lastNode);
lastNode = a.get(i).n;
}
t = new TestDraw(a,g);
while(true)
{
t.adjust();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Wenn ich laufe Beispiel können wir Graph hat Farben nur für das Blinzeln des Auges statt Anzeige für Zeit in Thread.sleep()
Irgendwelche Kommentare von Ihrer Seite? –
Ich habe meine Antwort korrigiert Ich hoffe, das ist es, was Sie suchen –