Threads Timer wird unterbrochen

GreenIguana

Mitglied
Hallo Leute,
ich habe einen java.swing.Timer in ein Programm eingebaut. Dieser wird, auf sieben Millisekunden eingestellt,
bevor er alle Programmschritte abgearbeitet hat, unterbrochen, er soll jedoch durchlaufen.
Wird die Klasse Timer auch vom Thread-Scheduler geregelt (sonst sind nur noch main- und Swing-Threads laufen) oder wie läuft das ab?
Hoffe das klingt verständlich... *überflieg*... oder auch nicht :D.

Schonmal danke im Voraus!
Grüße,
Grüner... Leguan? :bahnhof:
 

GreenIguana

Mitglied
@XHelp Wenn Du 2000 Zeilen Code haben willst, dann bitte, aber ich glaube, dass Dir das nicht hilft.
So viel: Es werden jeden Frame ca. 20 ~0,5Mb große Images auf ein JPanel gezeichnet.
 

XHelp

Top Contributor
Es sind wohl kaum 2000 relevante Zeilen. Reduziere das auf das wesentliche, dann werden nur 1-2 Dutzend überbleiben.
 

GreenIguana

Mitglied
Also hier ein paar:
Java:
timer = new Timer(7, this);
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);

public void actionPerformed(ActionEvent e) {*Die besagten Zeilen mit Aufrufen*}
 

GreenIguana

Mitglied
Naja, da sollte nichts unterbrochen werden, deswegen ist der Fehler irgendwo in deinem Code.
Ich glaube doch, da wie folgt:
Der Durchlauf wird unterbrochen, weil manchmal nur der zuerst gezeichnete und alles überdeckende Hintergrund zu sehen ist. Manchmal zusätzlich auch das zweitgezeichnete Bild usw. Also sind auch die zeitlichen Abstände immer unterschiedlich, werden aber mit zunehmender Programmlaufzeit immer kürzer (anfänglich läuft es so gut wie einwandfrei).
 

turtle

Top Contributor
Ich verstehe nichts:bahnhof:

Aber es hört sich für mich so an, als ob da von mehreren Threads versucht wird eine GUI zu modifizieren. Dieses geht in Swing nicht und Änderungen an der GUI dürfen nur vom Event-Dispatch-Thread (EDT) gemacht werden.

Ich sehe auch nicht, wodurch der Timer unterbrochen werden sollte. Weiterhin verstehe ich nicht, wofür Du meinst einen Timer einzusetzen,der durchlaufen soll. Ist das nicht Aufgabe des Hauptprogramms?

Alles zusammen:
Wir benötigen eindeutig mehr Infos, damit wir Dir weiterhelfen können;)
 

GreenIguana

Mitglied
Dieses geht in Swing nicht und Änderungen an der GUI dürfen nur vom Event-Dispatch-Thread (EDT) gemacht werden.
Doch, das geht! Wenn man z.B. (in einem sehr kleinen Programm) in der vom "main-thread" aufgerufenen
Code:
main(String[])
-methode einer sub-Klasse von JPanel
Code:
repaint();
aufruft, und die Methode
Code:
paint(Graphics)
oder
Code:
paintComponent(Graphics)
in etwa so
Java:
public void paint(Graphics g) {
		
		g2D = (Graphics2D) g;
		
                /** Anderes Gebimsel mit dem Graphics2D-Object */
	}
überschreibt, passieren die Änderungen bestimmt auch im Thread "main", wenn aber der durch den aufruf von
Code:
repaint()
etwas im Event-Dispatching-Thread in Gang gesetzt wird, ist das auch ok und ändert nichts daran, dass die Vorgehensweise beim Zeichnen korrekt ist, und auch in zahlreichen Lehrbüchern vertreten ist.
Wenn ich Dich oder etwas im Swing-Komplex falsch verstanden habe, tut es mir Leid. Lass es mich wissen.
Gruß,
Grüner... Leguan:bahnhof:
 

XHelp

Top Contributor
passieren die Änderungen bestimmt auch im Thread "main"
Öhm, nö?
Java:
public class Test {
	public static void main(String[] args) {
		JFrame frame = new JFrame(){
			@Override
			public void paint(Graphics g) {
				super.paintComponents(g);
				System.out.println(">>>>>paintComponent called");
				StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
				for (StackTraceElement e: stackTrace) {
					System.out.println(e);
				}
			}
		};
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(300, 300);
		frame.setVisible(true);
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("<<<<<REPAINT FROM MAIN");
		frame.repaint();
	}
}

Aber generell verstehe ich nicht, worum es hier geht. Mittlerweile 2 Leute sagen dir, dass der Fehler höchstwahrscheinlich irgendwo in deinem Code ist. Du behauptest hingegen, dass das nicht der Fall ist... es läuft zwar nichts, du weißt nicht warum es so ist oder wo der Fehler ist, aber in deinem Code ist es mit Sicherheit nicht :bahnhof:
Alleine schon die Tatsache, dass da irgendwas alle 7ms (142 mal pro Sekunde) gezeichnet werden soll erscheint mir schon äußerst suspekt. Und die Aussage "Durch den Timer läuft tatsächlich das gesamte Programm" lässt mich auch irgendwie an der Unfehlbarkeit des Codes zweifeln.
 

GreenIguana

Mitglied
Ist es möglich die ganze actionPerformed-Methode zu sehen?
Es wird euch nicht viel helfen, weil insgesamt 34 verschiedene Klassen á 350 Zeilen aufgerufen werden, aber bitte. (Alle Kommentare habe ich rausgenommen und den Code um für hier wichtige Kommentare ergänzt).
Java:
public void actionPerformed(ActionEvent e) {
		
		paint();
		
		int delta = getDelta();
		samShots = player.shots;

		for (int i = 0; i < enemies.size(); i++) {
			for (int y = 0; y < enemies.get(i).getShots().size(); y++)
				enemyShots.add(enemies.get(i).getShots().get(y));

		}

		for (int i = 0; i < doors.size(); i++)
			doors.get(i).animate();

		for (int i = 0; i < enemies.size(); i++) {

			enemies.get(i).animate();

			if (!enemies.get(i).getIsLiving()) {

				items.add(new ItemHeart(enemies.get(i).getX(), enemies.get(i).getY()));
				enemies.remove(i);

			}
		}

		if (enemies.size() == 0) {
			for (int i = 0; i < doors.size(); i++) {

				if (Room.rooms[doors.get(i).getDestination()].getEnemies().size() == 0)
					doors.get(i).isClean();

			}
		}

		if (yOffsetSource == 1080 & yOffset < 1080) {
			yOffset += xOffsetSpeed;
		}

		if (yOffsetSource == -1080 & yOffset > -1080) {
			yOffset -= xOffsetSpeed;
		}
		if (xOffsetSource == 1920 & xOffset < 1920) {
			xOffset += yOffsetSpeed;
		}
		if (xOffsetSource == -1920 & xOffset > -1920) {
			xOffset -= yOffsetSpeed;
		}

		if (yOffsetSource == 1080 & yOffset >= 1080 | yOffsetSource == -1080 & yOffset <= -1080) {
			yOffset = yOffsetSource = 0;
			changeMainRoomToSecondary();
		}
		if (xOffsetSource == 1920 & xOffset >= 1920 | xOffsetSource == -1920 & xOffset <= -1920) {
			xOffset = xOffsetSource = 0;
			changeMainRoomToSecondary();
		}

		callManager(delta);  // Hier wird ein Großteil des Programms aufgerufen
		paint(); // Hier wird ein Buffer, der mit der für das Rendern zuständigen Klasse verknüpft ist, aufgefrischt

	}
 

XHelp

Top Contributor
Mach mal an den Anfang der Methode ein Sysout "Ich wurde aufgerufen..." und ans Ende "Und jetzt bin ich fertig..."
Dann müssten beide Ausgaben in der Konsole erscheinen.
 
S

Spacerat

Gast
Glaskugel sagt: Problem liegt an Code...
Ich denke mal, dass sie (die Glaskugel) damit meint, dass dort irgendwo Fehler und RuntimeExceptions z.B. durch catch Throwable abgefangen werden könnten, die unter anderem auch "OutOfMemory"-Errors verschlucken. 2000 Zeilen Code mit Bildmanipulation für 7ms sind schon beachtlich.
 

turtle

Top Contributor
Diese Vermutung wie Spacerat habe ich auch. Ich vermute in den Untiefen des Programms eine Exception. die Du nicht zu sehen bekommst.

Wrappe mal Deine gesamte actionPerformed-Methode in einen try-catch Block und prüfe ob da eine Exception geworfen wird. Meine Vermutung ja und glaube an eine ConcurrentModificationException.

Java:
	public void actionPerformed(ActionEvent ae) {
		try {
			// Deine bisherigen Aufrufe hier
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
 

GUI-Programmer

Top Contributor
Ich vermute mal, dass das Problem hier mit
Code:
repaint()
zusammenhängt. Denn diese Methode zeichnet nicht sofort alles neu, sondern setzt lediglich den Hinweis/Wunsch des Neuzeichenens. Somit stimmt wohl auch folgendes vermutlich nicht:
Und ca. 140 Fps habe ich auch :pueh: :D

Die Fps ermittelst du, wenn du die paint()-Methode der ContentPane des Haupt-JFrames überschreibst, oder das obersten JPanels, in welchem deine Zeichenvorgänge ablaufen, und vor den super.paint()-Aufruf die Zeit misst und danach. Auf jeden Fall nicht, wenn du die Zeit vor und nach dem repaint()-Aufruf oder in dem Thread (-> hier Timer) misst.

[JAPI]http://docs.oracle.com/javase/7/docs/api/java/awt/Component.html#repaint%28%29[/JAPI]
Painting in AWT and Swing
 
S

Spacerat

Gast
Wrappe mal Deine gesamte actionPerformed-Methode in einen try-catch Block und prüfe ob da eine Exception geworfen wird. Meine Vermutung ja und glaube an eine ConcurrentModificationException.

Java:
	public void actionPerformed(ActionEvent ae) {
		try {
			// Deine bisherigen Aufrufe hier
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
Wenn meine Vermutung stimmt und irgendwo bereits ein [c]catch(Throwable t)[/c] eingefügt wurde, hat TO davon auch nicht mehr viel.
Aber GUI-Programmers Vermutung kann natürlich ebenso zutreffen. Wenn man innerhalb eines EDT-Durchlaufs 140 mal [c]repaint()[/c] aufruft, rendert man ebensoviele Frames in den Hades. Das ist so effizient, als würde man ein Backup-Device nach [c]/dev/null[/c] mounten.
 

GreenIguana

Mitglied
Ich vermute mal, dass das Problem hier mit
Code:
repaint()
zusammenhängt. Denn diese Methode zeichnet nicht sofort alles neu, sondern setzt lediglich den Hinweis/Wunsch des Neuzeichenens. Somit stimmt wohl auch folgendes vermutlich nicht:

Die Fps ermittelst du, wenn du die paint()-Methode der ContentPane des Haupt-JFrames überschreibst, oder das obersten JPanels, in welchem deine Zeichenvorgänge ablaufen, und vor den super.paint()-Aufruf die Zeit misst und danach. Auf jeden Fall nicht, wenn du die Zeit vor und nach dem repaint()-Aufruf oder in dem Thread (-> hier Timer) misst.

[JAPI]http://docs.oracle.com/javase/7/docs/api/java/awt/Component.html#repaint%28%29[/JAPI]
Painting in AWT and Swing

Endlich einmal etwas hilfreiches:toll:. Aber mein Problem ist immer noch nicht gelöst. Ich werde das versuchen anders zu gestalten. ;) Mal schauen...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Threads Timer wird immer schneller Allgemeine Java-Themen 6
W Timer terminiert nicht Allgemeine Java-Themen 5
W Timer Konzept-Frage Allgemeine Java-Themen 16
Z Timer Allgemeine Java-Themen 5
H Timer funktioniert nicht? Allgemeine Java-Themen 3
Tacofan Kurzer Timer Allgemeine Java-Themen 22
H Consumer (Java8 Lambda) an Timer übergeben Allgemeine Java-Themen 2
wolfgang63 Best Practice Taktgeber oder Timer mit variablem Intervall Allgemeine Java-Themen 1
I Timer Allgemeine Java-Themen 1
X Timer Allgemeine Java-Themen 3
C Timer? Allgemeine Java-Themen 8
U Timer - Timertask endet nicht Allgemeine Java-Themen 4
X timer.schedule - Allgemeine Java-Themen 7
D Simpler Timer zum warten Allgemeine Java-Themen 19
H java.util.Timer und Funktion mit SQL Exception Allgemeine Java-Themen 5
P Java Timer Allgemeine Java-Themen 3
K Timer Thread Allgemeine Java-Themen 8
E Wie Timer anbringen mit Designer in Netbeans Allgemeine Java-Themen 5
M Ampelsteuerung über Timer in Java realisieren Allgemeine Java-Themen 3
O Timer pausieren Allgemeine Java-Themen 5
M Timer von nicht existiertem Objekt stopen Allgemeine Java-Themen 5
B util.Timer zu langsam? Allgemeine Java-Themen 3
P Java Timer Allgemeine Java-Themen 2
S Timer in Applet? Allgemeine Java-Themen 11
G Swing Timer führt Methode nicht aus Allgemeine Java-Themen 2
V Frage zu util.Timer (-> TimerTask) Allgemeine Java-Themen 2
P Swing Eine Sekunde warten (Timer) Allgemeine Java-Themen 7
E Timer class macht einfach garnichts :/ Allgemeine Java-Themen 6
T Timer oder Alternative? Allgemeine Java-Themen 3
Z Timer -> Thread jeden Tag ausführen Allgemeine Java-Themen 5
D Probleme mit einem Timer Allgemeine Java-Themen 6
E Timer - gleichen Task mehrfach planen Allgemeine Java-Themen 2
D Timer oder Thread, das ist hier die Frage Allgemeine Java-Themen 3
A TimerTask - Task stoppen - timer.cancel() funktioniert nicht Allgemeine Java-Themen 8
S Problem mit einem Timer (Aktualisierung etc.) Allgemeine Java-Themen 2
B Timer übergabe Allgemeine Java-Themen 3
G Timer abbrechen und neu starten Allgemeine Java-Themen 3
G timer mit buttondruck abbrechen Allgemeine Java-Themen 7
T Timer oder ähnliches? Allgemeine Java-Themen 3
O Timer und TimerTask: Programm terminiert nicht! Allgemeine Java-Themen 3
O Thread als Timer Interrupt Allgemeine Java-Themen 2
C Timer.scheduleAtFixedRate(). Allgemeine Java-Themen 5
H gibts in Java sowas wie in Visual Basic den Timer? Allgemeine Java-Themen 5
B 24 Uhr Timer Task Allgemeine Java-Themen 5
G Timer nur 64 mal pro Sekunde? Allgemeine Java-Themen 18
S Frage zu jTDS, JAVA allgemein und Timer Allgemeine Java-Themen 6
L Problem mit Timer Allgemeine Java-Themen 7
J Timer-Objekt / Task-Zustand ermitteln Allgemeine Java-Themen 5
N Lwjgl 3d Objekt wird schmaler, wenn es sich dreht Allgemeine Java-Themen 0
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
berserkerdq2 Wenn ich einfach eine GIF in den Scenebuilder als Bild reinpacke, wird das dann asl Gif angezeigt Allgemeine Java-Themen 1
G Popup wird nicht sichtbar Allgemeine Java-Themen 9
8u3631984 Funktions Parameter mit Lombok "NonNull" annotieren wird in Jacococ Testcoverage nicht herausgefiltert Allgemeine Java-Themen 3
M Java Überprüfen ob .exe-Datei bereits ausgeführt wird Allgemeine Java-Themen 2
Calli11 Was muss ich hier in die Main schreiben, damit das Programm ausgeführt wird? Allgemeine Java-Themen 4
Sachinbhatt Wie wird die Typumwandlung bei Mehrfachvererbung in Java implementiert? Allgemeine Java-Themen 3
Y MVVM wie wird Eventhandler tausch geregelt Allgemeine Java-Themen 4
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
T ImageIcon wird nicht angezeigt Allgemeine Java-Themen 6
N Warum wird die For Schleife nicht betreten Allgemeine Java-Themen 4
N warum wird es doppelt ausgegeben Allgemeine Java-Themen 6
A code wird nicht ausgeführt Allgemeine Java-Themen 3
Y Warum wird das JLabel falsch verschoben? Allgemeine Java-Themen 1
T Schaltfläche wird nicht gefunden Allgemeine Java-Themen 4
N Eingabe wird immer als "false" ausgegeben Allgemeine Java-Themen 6
D Firebase retrieve data Problem, Child Element wird nicht angesprochen Allgemeine Java-Themen 0
M Frage-Antwortspiel wie Wer wird Millionär Allgemeine Java-Themen 1
Zrebna Gibt es eine Möglichkeit eine NPE zu vermeiden, wenn null returned wird? Allgemeine Java-Themen 3
R Warum wird mir in der Konsole das "Standard Array" ausgegeben? Allgemeine Java-Themen 2
C FileLock - Exception wird immer geworfen Allgemeine Java-Themen 4
R Was muss ich ändern, damit der Kreis links unten gezeichnet wird? Allgemeine Java-Themen 17
hello_autumn Java_Home geändert auf Java 13, trotzdem wird Java Version 8 angezeigt. Allgemeine Java-Themen 2
Thallius Char +1 wird int? Allgemeine Java-Themen 7
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
F Scrollbar wird nicht angezeigt Allgemeine Java-Themen 0
B Discord Bot - Funktion wird nicht aufgerufen Allgemeine Java-Themen 1
I Temp-Datei wird nicht gelöscht Allgemeine Java-Themen 12
S If-Menü wird doppelt ausgegben Allgemeine Java-Themen 4
P Variable wird in for - loop nicht richtig hochgezählt Allgemeine Java-Themen 11
S Wird bei den JREs 9, 10, 11+ ueberhaupt noch Bytecode ausgefuehrt..? Allgemeine Java-Themen 8
FRI3ND JFrame wird nicht angezeigt Allgemeine Java-Themen 3
T Plötzlich wird package nicht mehr gefunden Allgemeine Java-Themen 3
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
S Datei wird nicht gefunden Thread.currentThread().getContextClassLoader().getResourceAsStream() Allgemeine Java-Themen 1
mrbig2017 Sleep wird ignoriert und der Thread wartet nicht Allgemeine Java-Themen 1
mrbig2017 Threads wait wird nicht durch notify beendet! Allgemeine Java-Themen 3
kodela Klassen Klassenvariable wird nicht gesetzt Allgemeine Java-Themen 23
M Was geschieht mit Java-Klasse, die aus ArrayList entfernt wird? Allgemeine Java-Themen 10
kodela Drücken der ALT-Taste wird nur bei jedem zweiten Mal erkannt Allgemeine Java-Themen 5
Arif Input/Output Serialisierung - Datei wird nicht erzeugt Allgemeine Java-Themen 3
D Cursor unsichtbar, wenn Kontextmenü aufgerufen wird Allgemeine Java-Themen 5
K Arbeitsspeicher wird langsam voll Allgemeine Java-Themen 6
The Pi Wie oft wird ein Buchstabe in einem Wort wiederholt? Allgemeine Java-Themen 16
N Datentypen If-Statement wird "übersprungen" Allgemeine Java-Themen 2
F Java Mail Problem: Authentifizierung wird nicht immer mitgeschickt Allgemeine Java-Themen 1
T Textarea text wird immer überschrieben Allgemeine Java-Themen 4
C Durch klicken von Button in GUI wird leeres Fenster geöffnet und nicht mein Spiel "Memory" Allgemeine Java-Themen 13
T Java wird nicht gefunden Allgemeine Java-Themen 32
Tacofan GIF-Bild wird "zerstört" Allgemeine Java-Themen 3
Z Exception wird nicht ausgelöst Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben