Darstellung dauert zu lange. Wie rest verzögern?

Arp

Mitglied
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:

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:
S

SlaterB

Gast
du könntest vor dem repaint eine int oder boolean-Variable setzen
und am Ende von paint wird diese Variable geändert,

auf diese Änderung wartest du:
Java:
while (..) {
  Thread.sleep(30); // 30ms waren
}
oder ganz einfach zwischen den Änderungen generell eine bestimmte Zeit wie 30ms warten,
dann ist das Zeichnen vielleicht schon fertig

noch besser:
du könntest die neuen Kooridinaten in einer neuen lokalen Liste speichern und erst ganz am Ende diese neue Liste ins Klassenattribut speichern,
in paint dagegen wird am Anfang eine lokale Variable mit dem Inhalt der änderbaren Klassenattribute gesetzt,
so kann es fast keine Probleme durch Datenänderungen mehr geben,
allenfalls werden Schritte übersprungen wenn es ohne sleep() mehr Durchläufe gibt als gepaintet werden kann

ganz sicher wird es durch Synchronisation bei den Kopiervorgängen, oder Speicherung der Daten in exakt einem höheren Objekt,
ansonsten besteht die Möglichkeit, dass die Schleife gerade einen Teil der Daten aktualisiert hat und paint zeitgleich einen Teil alte + einen Teil neue Daten kopiert und dann anzeigt

edit:
übrigens besser
Java:
public void paintComponent(Grpahics g) {
   super.paintComponent(g);
   ..
verwenden
 
Zuletzt bearbeitet von einem Moderator:

Arp

Mitglied
Hi,

Die Idee ist eigentlich gut, aber scheinbar hilft das nicht wirklich was.

Habe jetzt am Anfang der paint Methode ein go = false, am ende der Methode ein go = true

und in der Main steht nun nach dem repaint()

Java:
MainWindow.repaint();
while(go==false)
{
  	try 
   	{
  		Thread.sleep(0,500); // wartet 500 ns
   	} 
    	catch (InterruptedException e) 
    	{
   		e.printStackTrace();
    	}
}

Die animation läuft zwar, aber auf der console werden trotzdem ständig ArrayIndexOutofBounds Errors angezeigt. Und das kann ich mir jetzt eigentlich nicht erklären. Denn wenn repaint nun im eigenen Thread abläuft, sollte es in der main, sequentiell nicht weiter gehen solang die static boolean go nicht auf true steht. Aber trotzdem scheinen die Daten geändert zu werden.

Ich versuche das mal so umzubauen das erstmal alles eingelesen wird, dann in einem Vector gespeichert wird das pro element die anderen beiden Vector's erhält.
 
Zuletzt bearbeitet:
S

SlaterB

Gast
schreibe doch ein System.out.println()-Log, wann beginnt paint, wann endet es,
wann befindet sich die Schleife im Warten, wann rechnet sie,

theoretisch ist sicher möglich, dass das Warten gerade zu Ende ist und Rechnen wieder losgeht und dennoch gleichzeitig erneut gemalt wird,
richtiger gegenseitiger Ausschluss heißt Synchronisation
 
S

SlaterB

Gast
oh stimmt, zum Glück war meine Idee bisschen besser als das Verständnis des Fehlers danach ;)
 
S

SlaterB

Gast
nein, direkt schon gar nicht, sonst wäre es überhaupt nicht nebenläufig,
ansonsten müsste diese Methode ähnlich deinem Code warten bis ein separater Thread paint aufruft, auch kompliziert

nein, das bedeutet nur das irgendwo die Info hinterlegt wird, bei nächster Gelegenheit zu malen,
das kann durchaus noch paar ns dauern, bis nach zufälligen x weiteren Befehlen deiner main-Methode der nächsten Thread überhaupt erst drankommt,
das kann ewig dauern wenn die GUI gerade blockiert ist,
das kann gar keine Auswirkungen haben die GUI nicht zu sehen ist oder paint gerade läuft
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
MiMa Darstellung von FXML ateien nicht korrekt (SceneBuilder) AWT, Swing, JavaFX & SWT 2
D Button und Textfeld Darstellung AWT, Swing, JavaFX & SWT 3
G listener repaint() - verschiedene Darstellung AWT, Swing, JavaFX & SWT 24
H JavaFX - Button und Text - Falsche Darstellung AWT, Swing, JavaFX & SWT 3
Y Darstellung und MouseHover bei bestimmten Wörtern in einem String AWT, Swing, JavaFX & SWT 2
W Swing bzgl. Tableskalierung/Darstellung einer Matrix AWT, Swing, JavaFX & SWT 8
J Problem mit Button darstellung AWT, Swing, JavaFX & SWT 23
M Swing JTable, wie erreiche ich folgende Darstellung? AWT, Swing, JavaFX & SWT 10
M AWT LabelArray verschobene Darstellung AWT, Swing, JavaFX & SWT 2
B Transformation und Darstellung von Koordinaten AWT, Swing, JavaFX & SWT 5
N Swing Java Komponente zur Darstellung von klickbaren Links, die Java Funktionen ausführen können AWT, Swing, JavaFX & SWT 2
A Swing Darstellung von JComponents in Swing AWT, Swing, JavaFX & SWT 14
M Swing JTable drucken/Darstellung AWT, Swing, JavaFX & SWT 2
E Swing Darstellung einer Zeilenbar AWT, Swing, JavaFX & SWT 6
M Eine nicht korrekte Darstellung bei repaint() warum? AWT, Swing, JavaFX & SWT 4
U Swing Problem bei der Darstellung "komplexer Objecte" in einer JList mit AbstractListModel: AWT, Swing, JavaFX & SWT 3
Y LayoutManager Keine vollständige Darstellung der Tabelle mit GridBagLayout AWT, Swing, JavaFX & SWT 3
S LayoutManager Fehlerhafte Darstellung einer Statusleiste/Statusbar AWT, Swing, JavaFX & SWT 6
H Thread-Problem mit der Darstellung beim Sperren des Fensters AWT, Swing, JavaFX & SWT 2
S Grafische Darstellung von signalen AWT, Swing, JavaFX & SWT 2
S jTable size und Text darstellung AWT, Swing, JavaFX & SWT 2
L SWT Darstellung des Datums in Textfeld? AWT, Swing, JavaFX & SWT 2
M SWT Probleme bei der Darstellung des "&"-Zeichens... AWT, Swing, JavaFX & SWT 3
E Darstellung komplexer Formen, z.B. gebogener Pfeil AWT, Swing, JavaFX & SWT 2
P Problem mit Darstellung von JButton(s) AWT, Swing, JavaFX & SWT 2
D Darstellung in Swing wie HTML? AWT, Swing, JavaFX & SWT 2
R Darstellung von JButton AWT, Swing, JavaFX & SWT 6
G Swing Darstellung JTable AWT, Swing, JavaFX & SWT 2
T Swing Java Darstellung einer Tabelle AWT, Swing, JavaFX & SWT 3
S Unterschiedliche Darstellung Java 5 und 6 AWT, Swing, JavaFX & SWT 7
B Probleme bei JPanel Darstellung AWT, Swing, JavaFX & SWT 6
M GBL - Darstellung gestreckt? AWT, Swing, JavaFX & SWT 3
P Applet darstellung von Textfeldern Problem AWT, Swing, JavaFX & SWT 3
O JComboBox andere Darstellung des Inhaltes + größe der Auswah AWT, Swing, JavaFX & SWT 11
M Swing mit Gtk - Fehlerhafte Darstellung AWT, Swing, JavaFX & SWT 3
S JTree - Darstellung von Ordnern rückwärts AWT, Swing, JavaFX & SWT 4
C Fragen zur Darstellung einer JTable mittels Renderer AWT, Swing, JavaFX & SWT 2
H Darstellung einer Kurve im Koordinatensystem AWT, Swing, JavaFX & SWT 8
T [gelöst] JFrame Grundlagen (Größe und Darstellung) AWT, Swing, JavaFX & SWT 6
G JTable dynamische Darstellung der ankommenden Daten AWT, Swing, JavaFX & SWT 19
G Darstellung von JComboBox AWT, Swing, JavaFX & SWT 14
S Gui Darstellung AWT, Swing, JavaFX & SWT 2
M Komische Sache bei der Darstellung auf einem JPanel AWT, Swing, JavaFX & SWT 5
S Swing Element für Explorer-Fenster darstellung AWT, Swing, JavaFX & SWT 13
P Darstellung eines Graphen AWT, Swing, JavaFX & SWT 2
G keine darstellung in JTable AWT, Swing, JavaFX & SWT 2
A JLabel: Unterschiede zw. JRE 1.3 und 1.5 in der Darstellung AWT, Swing, JavaFX & SWT 3
B Komische Darstellung unter Windows 2000 AWT, Swing, JavaFX & SWT 2
Z Seltsame Darstellung verschachtelter GridBagLayouts AWT, Swing, JavaFX & SWT 2
M SWT Darstellung Linux / Win verschieden? AWT, Swing, JavaFX & SWT 4
P Fehlerhafte Darstellung bei JLabel.setText AWT, Swing, JavaFX & SWT 2
C Timer, Darstellung einer Uhr AWT, Swing, JavaFX & SWT 4
D Wie Darstellung / Layout als Liste AWT, Swing, JavaFX & SWT 2
T darstellung eines polynom 5.grades AWT, Swing, JavaFX & SWT 2
S JTable + Sortieren => Problem bei Darstellung AWT, Swing, JavaFX & SWT 13
U JSlider - Probleme bei der Darstellung AWT, Swing, JavaFX & SWT 3
V jTalbe: Probs bei Icon Darstellung AWT, Swing, JavaFX & SWT 4
Z Empfehlung für solche Darstellung! AWT, Swing, JavaFX & SWT 4
F Darstellung von Tastaturkürzel in JMenuItem AWT, Swing, JavaFX & SWT 13
R Mehrzeilige Darstellung von Spalten in SWING-Tabellen AWT, Swing, JavaFX & SWT 5
M Problem mit JTree-Darstellung AWT, Swing, JavaFX & SWT 5
T Problem mit Darstellung AWT, Swing, JavaFX & SWT 6
C JWindow.setVisible(true) dauert ewig AWT, Swing, JavaFX & SWT 7
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
K Swing DefaultListModel braucht zu lange, um Wert zu setzen AWT, Swing, JavaFX & SWT 7
S PDF Printjob lange in Warteschlange AWT, Swing, JavaFX & SWT 0
G EventDispatchThread und lange Berechnungszeit AWT, Swing, JavaFX & SWT 3
J Zu lange Wörter umbrechen in JLabel AWT, Swing, JavaFX & SWT 5
E 3D-Grafik JOGL (lädt sehr lange) AWT, Swing, JavaFX & SWT 20
V Swing remove(Component) blockiert Thread sehr lange. AWT, Swing, JavaFX & SWT 6
R JTable Darstellen der selektierten Zelle braucht lange AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben