Mein Programm hat mir gerade bewiesen das ich mich doch nicht so ganz durchblicke.. Am besten kopiere ich mal den ganzen fraglichen Code rein:
Das "Problem" liegt an der mit <= hier markierten stelle. Points sind dabei im Prinzip ein Array aus Punkten, welche auch noch Geschwindigkeiten etc gespeichert haben. Ich habe mir das so gedacht: Mit points = cache.get() kopiere ich die Werte der Punkte in das neue points Array der Renderschleife. Dann dürfte aber in der while(true) Schleife in run() nie ein neues Bild aufgebaut werden, die Werte werden hier ja nicht verändert und auch nie wieder get() aufgerufen. Fakt ist aber das er scheinbar immer auf die aktuellen Punktpositionen zugreift, denn das Bild bewegt sich. Scheinbar kopiert er nicht die Werte sondern legt sich direkt eine "Verknüpfung" an, die direkt zugreift? Das gefällt mir nicht ganz..
Das würde auch meine gazen Rechenthreads doch ad absurdum führen, denn die sehen vereinfacht gesagt so aus:
aktuelle Punkte mit .get() in lokalpoints[] speichern
neue Werte berechnen.
zurückschreiben mit Punktspeicher.set(lokalpoints)..[/code]
Edit: Kurzgesagt, ich brauche eigentlich eine kopie der Werte und keine direkte Referenz. Nur wie?
Code:
public class Render extends Thread{
/** Creates a new instance of Render */
private Graphics graph;
private JPanel panel1;
private int rate;
private Datatank cache;
private int pointcount;
private Masspoint[] points;
public Render(Graphics device, JPanel panel, int _rate, Datatank _cache, int _pointcount) {
graph = device;
panel1 = panel;
rate = (int)(1d / (double)_rate * 1000d);
cache = _cache;
pointcount = _pointcount;
points = new Masspoint[pointcount];
points = cache.get(); <= hier..
}
public void run(){
while (true){
graph.clearRect((int)(-panel1.getWidth()/2), (int)(-panel1.getHeight()/2), panel1.getWidth(), panel1.getHeight());
for (int i = 0; i < pointcount; i++){
graph.fillOval((int)(points[i].x[0]*0.1), (int)(points[i].y[0]*0.1), 6, 6);
}
//graph.fillOval(0,0,10,10);
try{
sleep(rate);
}
catch (InterruptedException e){}
}
}
}
Code:
public synchronized Masspoint[] get(){
return points;
}
Das "Problem" liegt an der mit <= hier markierten stelle. Points sind dabei im Prinzip ein Array aus Punkten, welche auch noch Geschwindigkeiten etc gespeichert haben. Ich habe mir das so gedacht: Mit points = cache.get() kopiere ich die Werte der Punkte in das neue points Array der Renderschleife. Dann dürfte aber in der while(true) Schleife in run() nie ein neues Bild aufgebaut werden, die Werte werden hier ja nicht verändert und auch nie wieder get() aufgerufen. Fakt ist aber das er scheinbar immer auf die aktuellen Punktpositionen zugreift, denn das Bild bewegt sich. Scheinbar kopiert er nicht die Werte sondern legt sich direkt eine "Verknüpfung" an, die direkt zugreift? Das gefällt mir nicht ganz..
Das würde auch meine gazen Rechenthreads doch ad absurdum führen, denn die sehen vereinfacht gesagt so aus:
aktuelle Punkte mit .get() in lokalpoints[] speichern
neue Werte berechnen.
zurückschreiben mit Punktspeicher.set(lokalpoints)..[/code]
Edit: Kurzgesagt, ich brauche eigentlich eine kopie der Werte und keine direkte Referenz. Nur wie?