Hallo,
Ich habe eine 2D Simulation programmiert die simuliert was mit kollidierenden Galaxien passiert. Das ganze basiert auf einer N Body Simulation. Nun hab ich ein Problem mit der Darstellung. Ich speicher in der Simulation alle x Zeitschritte die koordinaten aller Teilchen und dann noch zwei Schlüsselwörter um sie zu trennen. Einmal TIME, um zu wissen das jetzt ein Zeitschritt abgelaufen ist, und einmal BLUE um zu wissen das ab da die Partikel zur zweiten "blauen" Galaxie gehören.
Um das darzustellen hab ich einen Player geschrieben der im prinzip nur die Textdatei einliest. Das ganze läuft in einer while schleife. Kommt zwischendurch eine Zeile mit "BLUE", wird die zeilennummer für später gespeichert. Kommt "TIME", dann wird alles was in zwei Vector's steht mittels drawOval gezeichnet. Kommt nichts von beiden, werden die einträge gesplittet und in den x bzw. y vector gespeichert. Danach werden die Vector's auf 0 gesetzt und der ganze spaß beginnt von vorn.
Nun, ich kenn mich mit Swing und co. nicht so wirklich aus, geschweige denn mit Threads. Aber nachdem ich hier einiges rumprobiert hab, glaube ich das die Darstellung der einzelnen Pixel offenbar in einem separaten Thread passiert. Das führt dann nun zum Problem das die for schleife die einfach den Vector durch geht nicht schnell genug fertig wird, und der ursprüngliche Thread schon anfängt diesen Vector zu überschreiben.
So sieht mein Code aus:
Könnt ihr mir vielleicht sagen wie ich das ändern kann, so dass das Programm immer abwartet bis repaint() fertig ist?
Thx.
Ich habe eine 2D Simulation programmiert die simuliert was mit kollidierenden Galaxien passiert. Das ganze basiert auf einer N Body Simulation. Nun hab ich ein Problem mit der Darstellung. Ich speicher in der Simulation alle x Zeitschritte die koordinaten aller Teilchen und dann noch zwei Schlüsselwörter um sie zu trennen. Einmal TIME, um zu wissen das jetzt ein Zeitschritt abgelaufen ist, und einmal BLUE um zu wissen das ab da die Partikel zur zweiten "blauen" Galaxie gehören.
Um das darzustellen hab ich einen Player geschrieben der im prinzip nur die Textdatei einliest. Das ganze läuft in einer while schleife. Kommt zwischendurch eine Zeile mit "BLUE", wird die zeilennummer für später gespeichert. Kommt "TIME", dann wird alles was in zwei Vector's steht mittels drawOval gezeichnet. Kommt nichts von beiden, werden die einträge gesplittet und in den x bzw. y vector gespeichert. Danach werden die Vector's auf 0 gesetzt und der ganze spaß beginnt von vorn.
Nun, ich kenn mich mit Swing und co. nicht so wirklich aus, geschweige denn mit Threads. Aber nachdem ich hier einiges rumprobiert hab, glaube ich das die Darstellung der einzelnen Pixel offenbar in einem separaten Thread passiert. Das führt dann nun zum Problem das die for schleife die einfach den Vector durch geht nicht schnell genug fertig wird, und der ursprüngliche Thread schon anfängt diesen Vector zu überschreiben.
So sieht mein Code aus:
Java:
import java.io.*;
import java.util.Vector;
import javax.swing.*;
import java.awt.*;
public class player
{
static Vector<Double> coordsx = new Vector<Double>();
static Vector<Double> coordsy = new Vector<Double>();
static double pc = 30.8566776e15;
static double faktor = 200*pc;
static double zeit = 0;
static int nr = 0;
public static void main(String args[]) throws IOException
{
BufferedReader in = new BufferedReader(new FileReader("out.txt"));
String zeile = "";
JFrame MainWindow = new JFrame("Simulator");
MainWindow.setLayout(null);
MainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MainWindow.setSize(900,900);
MainWindow.setResizable(false);
MainWindow.setContentPane(new MyComponent());
MainWindow.setVisible(true);
while((zeile=in.readLine())!=null)
{
if(zeile.contains("TIME"))
{
zeit = Math.round(Double.parseDouble(zeile.split("\t")[1]));
MainWindow.repaint();
coordsx.clear();
coordsy.clear();
}
else
{
if(zeile.contains("BLUE"))
{
nr = coordsx.size();
}
else
{
coordsx.add(Double.parseDouble(zeile.split("\t")[0]));
coordsy.add(Double.parseDouble(zeile.split("\t")[1]));
}
}
}
}
public static class MyComponent extends JComponent
{
/**
*
*/
private static final long serialVersionUID = 1L;
public void paint(Graphics g)
{
g.setColor(Color.RED);
g.drawLine(50,50,50,850);
g.drawLine(50,850,850,850);
// g.drawString("zeit: "+zeit+" Myr", 50, 20);
g.drawString(850*faktor/1000/pc+" kpc" ,20,40);
g.drawString(850*faktor/1000/pc+" kpc" ,820,835);
g.drawLine(40,50,60,50);
g.drawLine(850,840,850,860);
for(int i=0; i<nr-1;i++)
{
if(((coordsx.elementAt(i)/(faktor)+450)>51)&&(coordsy.elementAt(i)/(faktor)+450)<849)
{
g.setColor(Color.BLACK);
g.fillOval((int)(coordsx.elementAt(i)/(faktor)+450),(int)(coordsy.elementAt(i)/(faktor)+450),3,3);
}
}
for(int i=nr; i<coordsx.size();i++)
{
if(((coordsx.elementAt(i)/(faktor)+450)>51)&&(coordsy.elementAt(i)/(faktor)+450)<849)
{
g.setColor(Color.BLUE);
g.fillOval((int)(coordsx.elementAt(i)/(faktor)+450),(int)(coordsy.elementAt(i)/(faktor)+450),3,3);
}
}
}
}
}
Könnt ihr mir vielleicht sagen wie ich das ändern kann, so dass das Programm immer abwartet bis repaint() fertig ist?
Thx.
Zuletzt bearbeitet: