Frame friert ein

patal

Mitglied
Einen Guten Tag euch,

nach langem suchen und viel probieren bin ich zu keiner Lösung gekommen.

Und zwar geht es darum das, dass JFrame beim starten des Programmes komplett einfriert und es sich auch nicht mehr normal schließen lässt, sondern nur noch über des Task Manager sich der Prozess beenden lässt.

Das JFrame wird in einem eigen Thread gestartet und alle anderen Prozesse, bevor das Frame gestartet wird und vor allem auch danach, laufen völlig normal weiter und der Logger logt alles normal weiter und es werden keinerlei Exceptions dokumentiert und wenn das JFrame mit einem JPanel gefüllt wird, entstehen auch keine Fehler.

Da alle Prozesse, welche Endlosschleifen hervorrufen könnten, in eigenen Thread laufen und auch dies über den Logger auffallen würde, dass es sich hierbei um Endlosschleifen handeln, kann ich das immerhin ausschließen.

Der Fehler tritt ausschließlich beim starten des Frames auf, solange nicht alle komplett geladen wurde und zudem nur sehr sporadisch.
Durch einen Zufallen konnten wir aber den Fehler simulieren. Und zwar kommt es immer nur dann vor, wenn das Programm in dem Moment gestartet wird, in welchem der Rechner gerade voll am arbeiten ist.
Der Auslöser dafür ist eine Excel Datei, welche über ein eigenes Makro in einem bestimmten Zyklus Prozesse ausführt und da durch die CPU-Last kurzzeitig voll benötigt wird.

Mein Frage ist jetzt eben, ob sich jemand das irgendwie erklären kann, warum die GUI von mir dann komplett einfriert. Ich habe zu Testzwecken auch zum Teil den Inhalt nicht mehr laden lassen, sprich ein leeres Frame laden, und es kommt trotzdem in sehr seltenen Fällen vor, dass es einfriert.
Kann also irgendwie überwacht werden, ob das Frame richtig geladen hat oder irgend so etwas?

Die Rechner auf welchen das Programm läuft ist Windows 7
Java Version 1.7
i3-2100 3.1Ghz
4GB Ram

Vielleicht kann mir da je jemand ein paar Tipps geben, was ich noch probieren könnte ???:L

Gruß
Pascal
 
Hallo,

hat niemand hier eine Idee?
Oder hat jemand eine Idee wie man den Fehler suchen könnte?
Oder eben die Möglichkeit das, dass Programm selbst überwacht, ob das Fenster noch reagiert und wenn nicht das Frame neu laden soll ...

Gruß
Pascal
 
Ich hab von Swing nicht so viel Ahnung, aber vielleicht kannst du das Verhalten mit einem kleinen Beispiel nachstellen und hier posten. Nur von etwas Text ist es schwer bis unmöglich da eine genaue Aussage zu machen (ausser vielleich, man hatte das Gleiche Problem schon mal).
Für jemanden wie mich, der primär nur SWT/JavaFX/Android kennt, klingt es danach, als ob immer noch zu viel Arbeit auf dem Hauptthread gemacht wird - aber der Ansatz von Swing ist schon etwas anders als der von SWT und den anderen, daher muss ich mich mit meinen Mutmassungen zurückhalten...
 
In wie weit soll ich ein kleines Beispiel nachstellen?

Also der Haupttread läuft völlig normal weiter und beendet auch alles ganz normal.
-> Lässt sich über den Logger feststellen

Der Frame selbst wird in einem völlig eigenen Thread erstellt und parallel zu diesem Thread wird noch ein weiterer Thread für diverse Hintergrundarbeiten gestartet, welche aber nicht abhängig sind von einander.

Wie dem auch sei, der Thread in dem das Frame erstellt, bleibt in keiner weise hängen.
Bspw. Programm ablauf.

Thread für das Frame bzw. die GUI starten.
Normaler ablauf

1. Leeres JFrame erstellen
2. JFrame anzeigen
3. Panels erstellen und in das JFrame einfügen
4. JFrame aktualisieren (refresh repaint)
5. Weiterer diverser Code ausführen -> wird vom logger weiter dokumentiert

Wenn er dann mal hängen bleibt:
X = Mögicher Punkt an dem es einfriert.
Logger logt aber danach ganz normal weiter, wie wenn nichts passiert wird.
belibt es bspw. zwischen 3 und 4 hängen, wird 5 völlig normal weiter abgearbeitet.
Es handelt sich dabei aber um keine eigenen Threads, sondern läuft alles in dem GUI-Thread ab

1. Leeres JFrame erstellen
2. JFrame anzeigen
X. Frame friert ein -> es wird nur das Fenster angezeigt. Die Größe kann nicht verändert werden und das Fenster kann nicht geschlossen werden über das X oder über Rechtsklick schließen in der Taskleiste.
3. Panels erstellen und in das JFrame einfügen
X. Wahlweise auch wenn schon ein Panel eingefügt ist.
4. JFrame aktualisieren (refresh repaint)
5. Weiterer diverser Code ausführen -> wird vom logger weiter dokumentiert

-> Nach langem beobachten ist eben aufgefallen das, wenn im selben Augenblick, in dem das Programm gestartet wird und das JFrame erstellt wird der Rechner andere Arbeiten gleichzeitig ausführt mit sehr hohem Rechenbedarf (Eben das Macro in der Excel Datei) kommt es dazu, dass es einfriert.
 
Zuletzt bearbeitet:
Ich Programmiere viel mit Swing un ein Fall wie deiner ist mir bekannt. Ebenfalls sind mir zwei gründe dafür bekannt.
Endlos schleiße bzw. sehr lange arbeiten im Thread der Frame (Hast du ja ausgeschlossen)
Und Fehler im Look And Feel der Frame wenn z.b. Änderungen an der Frame nicht im Event dispatch Thread ausgeführt werden.
 
Könntest du das mit dem Event dispatch Thread irgendwie veranschaulichen was du damit genau meinst?
Ich hab mir zwar gerade das eine oder andere darüber durchgelesen, aber weiß nicht wie du das in Verbindung bringst damit.
Soll das heißen, dass sich wohl irgendwo beim erstellen des Frames irgend ein anderer Thread blöd mit rein spielt und etwas am Frame ändert?
 
Zuletzt bearbeitet:
Also etwas ältere LookAndFeel z.b. Substance LnF haben Probleme damit dinge an der Frame zu ändern wenn diese Änderungen nicht im Event dispatch Thread ausgeführt werden. Wenn ich z.b. den Text von einem Label in einem 3 Thread der Parallel zu meinem Frame und Work Thread läuft setzen will.
Du kann eine Änderung aber in den Frame Thread einbinden du kannst also einen Änderung an der Frame in Auftrag geben die sofort wenn die vorherige Änderung ausgeführt wurde ausgeführt wird.
Um dies zu Bewerkstelligen musst deine Frame so initialisiert werden.
Java:
SwingUtilities.invokeLater(new Runnable() {
		@Override
		public void run() {
			Main.frame=new VFrame();
		}
});
Wenn du dann eine änderrung an die Frame abgeben willst die nicht aus diesem Thread kommt muss sie ebenso gestartet werden.
Java:
SwingUtilities.invokeLater(new Runnable() {
		@Override
		public void run() {
			//was passieren soll
		}
});
Das gilt aber nicht für die Listener also wenn du im Frame Constructor einen ActionListener deiner Frame hinzugefügt hast dann ist der schon im Event dispatch Thread.

Wenn das nicht hilf würde ich folgende Stepps ab Arbeiten:
  • Alle Action Change etc. Listener auskommentieren
  • Frame starten wenn es fuktioniert alle Listener einzend nach einander wieder einschalten und immer wieder starten
  • Wenn es nicht fuktoniert dann wist deine Frame im falschen Thread oder wird von einem anderren Thread gestört

Als Tipp wenn du eine Frame erzeugst und dann z.b. in einem neben läufiger Thread immer wieder ein Label bzw. processBar etc neu setzt und diese Thread abstürtzt/unendlichkeit dann kann das ebenfalls zum einfrieren führen.

LG Foxei hoffe es hilft dir weiter
 

Zurück
Oben