Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 12, 2025 13:06

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: OpenGL Java Threads und Contexte
BeitragVerfasst: So Mär 25, 2007 14:20 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hallo zusammen,

Ich hab gerade ein (für mich) verzwicktes Problem:

Ich hab ne GUI-Componentensammlung geschrieben und bisher bei meinen Tests einfach ne Anwendung gebaut, die beim Erstellen des Fensters (oder halt am Anfang irgendwann) meine GL-Menüs mit den Componenten erstellt und dann in Zukunft einfach rendert. Geht auch alles ganz toll.

Jetzt wollte ich meine Componentensammlung in nem Projekt verwenden. Ich wollte auch ein Event (z.B. Maus-Klick) damit reagieren, dass ein Menü angezeigt wird. Und da knallts. Und zwar liegt auf meinem Formular ein TglLabel (selbstgeschriebene Klasse). Dieses label hat die eigenschaft, dass die Höhe und Breite des Labels nicht vom Nutzer gesetzt wird, sondern abhängig von Text, FontSize und Font berechnet wird. Falls der Font noch nie zuvor benutzt wurde muss er erst angelegt werden. Dazu wird in eine Textur gerendert - mit OpenGL. Und das ist das Problem. Ich benutze OpenGL innerhalb (bzw. in Folge) des Eventhandlers.

JOGL quittiert mir das mit einer GLException:
Code:
  1. javax.media.opengl.GLException: No OpenGL context current on this thread
  2.     at javax.media.opengl.glu.GLU.getCurrentGL(GLU.java:234)
  3.     at com.sun.opengl.util.texture.Texture.<init>(Texture.java:85)
  4.     at com.sun.opengl.util.texture.TextureIO.newTexture(TextureIO.java:423)
  5.     at com.sun.opengl.util.texture.TextureIO.newTexture(TextureIO.java:517)
  6.     at jogl_ttf_basics.TTF_Loader.loadFont(TTF_Loader.java:107)
  7.     at jogl_ttf_utils.TTF_Font_Manager.getFont(TTF_Font_Manager.java:75)
  8.     at jogl_gui_components.TglLabel.setText(TglLabel.java:140)
  9.     at jogl_gui_components.TglLabel.setFontID(TglLabel.java:166)
  10.     at jogl_gui_components.TUI_Manager.addNewComponent(TUI_Manager.java:816)
  11.     at com.mea.balancePC.menue.MainMenueCreator.createMenue(MainMenueCreator.java:93)
  12.     at com.mea.balancePC.Main.keyTyped(Main.java:156)
  13.     at java.awt.Component.processKeyEvent(Component.java:5443)
  14.     at java.awt.Component.processEvent(Component.java:5265)
  15.     at java.awt.Component.dispatchEventImpl(Component.java:3955)
  16.     at java.awt.Component.dispatchEvent(Component.java:3803)
  17.     at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1810)
  18.     at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:672)
  19.     at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:920)
  20.     at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:798)
  21.     at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:636)
  22.     at java.awt.Component.dispatchEventImpl(Component.java:3841)
  23.     at java.awt.Component.dispatchEvent(Component.java:3803)
  24.     at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
  25.     at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
  26.     at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
  27.     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
  28.     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
  29.     at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)


Meine Frage ist, was ich tun muss, damit innerhalb des Threads der Context verfügbar ist. Der Thread besteht ja nicht lange. Nur bis das Event abgearbeitet ist. Habt ihr ne Idee, bzw habt ihr verstanden was ich euch mitteilen wollte. ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 26, 2007 08:45 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 03, 2002 15:08
Beiträge: 662
Wohnort: Hamburg
Programmiersprache: Java, C# (,PhP)
Ich hab mit JOGL noch nicht gearbeitet, gehe aber mal davon aus das auch bei deren API die AWT/Swing Threads weiterhin bestehen und du deine Events auch über die ablaufen lassen solltest. Ein JOGLGLWindow/Canvas leitet doch bestimmt von einer anderen GUI Klasse ab oder? Dann sollte es eigentlich keinerlei Probleme geben da beide Threads getrennt voneinander laufen.

@Frage: Damit der Context in dem Context verfügbar ist, musst du ihn bei JEDEM Event dem EventThread zuweisen. Denke nicht das dies die beste Möglichkeit ist, besser ist es beide getrennt zu handhaben. Hab das mal mit nem LWJGL Projekt gemacht, das lief ganz gut :)

_________________
(\__/)
(='.'=)
(")_(")


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 26, 2007 21:11 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
@Flash: Warum mußt Du für jedes Event einen Thread aufmachen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 26, 2007 21:15 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich mach keine Threads auf. Java tut das. Jedenfalls glaube ich das dadurch der Fehler zu stande kommt. Ich kann aber (aller vorraussicht nach) im Eventhandler nicht auf das rendern in die Textur verzichten.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 27, 2007 00:16 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Ich habe keine Ahnung von Java. Aber: Ich sehe ein, dass Java anlässlich eines Fensters einen eigenen Thread aufmacht und eine eigene WindowProc (einen Windows-Event-Receiver) dafür hat. Aber der Eventhandler ist doch dem Fenster bzw. dem jeweiligen Widget zuzurechnen, oder? Und dieses Widget HAT doch einen Rendering Context. Fände ich unlogisch, wenn allein für einen Eventhandler ein neuer Thread aufgemacht wird. Was wäre dann z.B. mit einem Eventhandler "OnPaint", wo das Anwendungsprogramm zeichnen möchte und sich den Rendering Context des Fensters/Widgets ausborgen will?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 27, 2007 06:39 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 03, 2002 15:08
Beiträge: 662
Wohnort: Hamburg
Programmiersprache: Java, C# (,PhP)
Wieso willst du überhaupt im "Eventhandler" rendern? Der Eventhandler ist ausschließlich für die Events gedacht.
Du müsstest im Endeffekt 3 Threads haben.

Swing/AWT EventThread, Swing/Awt Render Thread und OpenGLCanvas Thread (synchronisiert mit Swing/AWT Render Thread).

Und dann klappt es eigentlich auch mit dem Event Handling. Entsprechend über getter und setter die Zustände an den OpenGL THread übergeben und die dazu passende Aktion auslösen, wie zb. nicht mehr Rendern.

Hast du im JOGL Forum schon nachgeschaut?
http://www.javagaming.org/forums/index.php?board=25.0

//edit: Vielleicht hilft dir auch dieses LWJGL Example weiter:
http://lwjgl.org/forum/index.php/topic,1451.0.html

_________________
(\__/)
(='.'=)
(")_(")


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 27, 2007 07:33 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo,

Als Workaround kann man im OpenGL-Thread eine Statusvariable setzen und dann abhängig von dieser in der display-Funktion OpenGL-Aktionen ausführen.
Eine andere Möglichkeit hab ich bisher leider nicht gefunden :(

Viele Grüße
dj3hut1

P.S. : Noch ein kleiner Tip von mir : (Input)-Events sollten auf synchronized gesetzt werden, sonst kann man ziemlich böse Überraschungen erleben


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 27, 2007 22:54 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das is blöd... :?

Kann man den Context nicht irgendwie sharen? Der Thread is ja nicht lange da...

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 27, 2007 23:04 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Ein Java-Thread kann doch eigentlich auch einem beliebigen System-Thread zugeordnet werden. Das muss nicht immer 1:1 sein, oder gibt es da irgendwelche Garantien? Daher müsste man dann eigentlich vor jedem Rendern wglMakeCurrent aufrufen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 28, 2007 09:28 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 03, 2002 15:08
Beiträge: 662
Wohnort: Hamburg
Programmiersprache: Java, C# (,PhP)
um nicht MakeCurrent aufrufen zu müssen, läuft der GLCanvas in einem eigenen Thread und muss auf Input von aussen warten. Wie dj3hut1 schon sagte ist es über Statusvariablen möglich, allerdings ist das über ein Interface flexibler zu gestalten.

_________________
(\__/)
(='.'=)
(")_(")


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 15 Queries | GZIP : On ]