Hallo!
Ich hab zur Zeit einen richtig üblen Käfer im Programm, der wirklich sehr unregelmäßig auftritt und auch nicht immer und auch nicht bei jedem. Bei dem Bug crasht die JVM mit einem schönen Errorlog. Soweit so gut. Ich bin mir relativ sicher, dass dieser Crash von Swing herrührt, da die dll Datei, die den Crash verursacht die: "comctl32.dll" ist und diese wohl für Dialoge usw. verantwortlich ist (in Windows).
Meine generelle Frage ist jetzt: wie programmiere ich am saubersten mit Swing, wenn ich aus anderen Threads heraus, die Oberfläche aktualisieren möchte? D.h. in "Labels" neuen Text setzen, in Tabellen neue Rows hinzufügen usw. Nach meinem wissenstand sollte ein "EventQueue.invokeLater" mit den entsprechenden Befehlen ausreichen. Diesen Aufruf habe ich dann in meinem Thread drin.
Dann noch eine andere Möglichekit, wie ich was aufrufe.
In meinem GUI Thread habe ich eine statische Funktion, die die GUI aktualisieren soll. Diese Funktion bekommt einen Wert und sagen wir ein Label bekommt diesen Wert dann als Text. Und in dieser statischen Funtkion, hab ich das EventQueue.invokeLater Konstrukt drin. D.h. mein Thread ruft diese statische Funktion hin und wieder auf, um die GUI zu aktualisieren, könnte es nun ein Problem sein, dass das EventQueue in meinem GUI Thread drin ist? Eigentlich doch nicht, EventQueue und invokeLater sind eh alles statische Funkionen..
Ich weiß nicht, vielleicht hab ich auch nen Denkfehler mit der ganzen Swing Sache. Evtl. liegts da auch garnicht dran, vielleicht dürfte die JVM garnicht crashen, auch wenn ich mit Swing schindluder treiben würde? Dann sollte es womöglich Java Exceptions geben, aber gleich die JVM abschmieren?
Wenn mir dieses CrashLog mehr infos geben würde.... mehr Infos als Hexadezimale Speicheradressen ...
Aufjedenfall hat der Crash was mit dem AWT Thread zutun und in dieser blöden DLL Datei, die im folgenden Ordner liegt:
C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83\comctl32.dll
Stack: [0x03350000,0x033a0000], sp=0x0339e7c4, free space=313k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C 0x000c013a
C [comctl32.dll+0x1207c]
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j sun.awt.windows.WToolkit.eventLoop()V+0
j sun.awt.windows.WToolkit.run()V+69
j java.lang.Thread.run()V+11
v ~StubRoutines::call_stub
=>0x031b1c00 JavaThread "AWT-Windows" daemon [_thread_in_native, id=544, stack(0x03350000,0x033a0000)]
Ich bin für alle Gedanken dankbar
Ich hab zur Zeit einen richtig üblen Käfer im Programm, der wirklich sehr unregelmäßig auftritt und auch nicht immer und auch nicht bei jedem. Bei dem Bug crasht die JVM mit einem schönen Errorlog. Soweit so gut. Ich bin mir relativ sicher, dass dieser Crash von Swing herrührt, da die dll Datei, die den Crash verursacht die: "comctl32.dll" ist und diese wohl für Dialoge usw. verantwortlich ist (in Windows).
Meine generelle Frage ist jetzt: wie programmiere ich am saubersten mit Swing, wenn ich aus anderen Threads heraus, die Oberfläche aktualisieren möchte? D.h. in "Labels" neuen Text setzen, in Tabellen neue Rows hinzufügen usw. Nach meinem wissenstand sollte ein "EventQueue.invokeLater" mit den entsprechenden Befehlen ausreichen. Diesen Aufruf habe ich dann in meinem Thread drin.
Dann noch eine andere Möglichekit, wie ich was aufrufe.
In meinem GUI Thread habe ich eine statische Funktion, die die GUI aktualisieren soll. Diese Funktion bekommt einen Wert und sagen wir ein Label bekommt diesen Wert dann als Text. Und in dieser statischen Funtkion, hab ich das EventQueue.invokeLater Konstrukt drin. D.h. mein Thread ruft diese statische Funktion hin und wieder auf, um die GUI zu aktualisieren, könnte es nun ein Problem sein, dass das EventQueue in meinem GUI Thread drin ist? Eigentlich doch nicht, EventQueue und invokeLater sind eh alles statische Funkionen..
Ich weiß nicht, vielleicht hab ich auch nen Denkfehler mit der ganzen Swing Sache. Evtl. liegts da auch garnicht dran, vielleicht dürfte die JVM garnicht crashen, auch wenn ich mit Swing schindluder treiben würde? Dann sollte es womöglich Java Exceptions geben, aber gleich die JVM abschmieren?
Wenn mir dieses CrashLog mehr infos geben würde.... mehr Infos als Hexadezimale Speicheradressen ...
Aufjedenfall hat der Crash was mit dem AWT Thread zutun und in dieser blöden DLL Datei, die im folgenden Ordner liegt:
C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83\comctl32.dll
Stack: [0x03350000,0x033a0000], sp=0x0339e7c4, free space=313k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C 0x000c013a
C [comctl32.dll+0x1207c]
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j sun.awt.windows.WToolkit.eventLoop()V+0
j sun.awt.windows.WToolkit.run()V+69
j java.lang.Thread.run()V+11
v ~StubRoutines::call_stub
=>0x031b1c00 JavaThread "AWT-Windows" daemon [_thread_in_native, id=544, stack(0x03350000,0x033a0000)]
Ich bin für alle Gedanken dankbar