Hi an alle die sich mit Threads gut auskennen, ich programmiere
ein Framework mit JOGL (Java OpenGL) und verstehe eine
bestimmte Sache einfach nicht.
Ein einfaches Jogl-Programm lässt sich mit folgendem
Code realisieren.
Und zwar gibt es hier einen Thread namens Animator, welcher immer wieder
eine Display-Methode aufruft, welche sozusagen als Hauptschleife dient.
In der Display-Methode werden die ganzen OpenGL-Zeichenoperationen vollzogen.
Am Ende des Programms starte ich diesen Animator-Thread mit anim.start().
Wenn ich das AWT-Fenster schließe dann wird vorher der Thread gestoppt
und somit die OpenGL-Zeichenoperationen nicht mehr ausgeführt, da
die Display-Methode nicht mehr intern aufgerufen wird. Anschließend
wird mit System.exit(0) das ganze Programm geschlossen.
Soweit sogut. Nun schreiben aber die Entwickler von JOGL, das das
Stoppen des Animators und ein direkt darauf folgendes System.exit(0) zu
Problemen führen kann. Das liegt daran, das OpenGL manchmal recht
lange braucht bis es gestoppt ist, bzw. bis der Animator
fertig mit stoppen ist. Hört sich irgendwie auch Plausibel an.
Sie empfehlen folgende Veränderung in meiner Klasse:
Das Stoppen des Animators und das System.exit(0) wird extra nochmal in einem
2. thread verstaut. Somit sollten keine Probleme auftauchen können.
Sie schreiben folgenden Kommentar dazu:
Kann mir das bitte jemand genau erklären, wie das genau mit diesem
2. Thread gemeint ist und was die AWT-Event-Queue da mitwirkt ?
Wird der anim.stop() Befehl in einem seperaten Thread mit sicherheit
ausgeführt, und in dem Hauptprogramm nicht unbedingt ?? Es ist sehr wichtig,
ich brauche das für eine Ausarbeitung
Vielen Dank schonmal im Vorraus
Gruss
Final
ein Framework mit JOGL (Java OpenGL) und verstehe eine
bestimmte Sache einfach nicht.
Ein einfaches Jogl-Programm lässt sich mit folgendem
Code realisieren.
Code:
import java.awt.event.*;
import java.awt.*;
import javax.media.opengl.*;
import com.sun.opengl.util.*;
public class JoglApp
{
public static void main(String[] args)
{
Frame fenster = new Frame("Jogl Fenster");
GLCanvas canvas = new GLCanvas();
canvas.addGLEventListener(new JoglEventListener());
final Animator anim = new Animator(canvas);
fenster.add(canvas);
fenster.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
anim.stop();
System.exit(0);
}
});
fenster.setSize(320,200);
fenster.setVisible(true);
anim.start();
}
}
Und zwar gibt es hier einen Thread namens Animator, welcher immer wieder
eine Display-Methode aufruft, welche sozusagen als Hauptschleife dient.
In der Display-Methode werden die ganzen OpenGL-Zeichenoperationen vollzogen.
Am Ende des Programms starte ich diesen Animator-Thread mit anim.start().
Wenn ich das AWT-Fenster schließe dann wird vorher der Thread gestoppt
und somit die OpenGL-Zeichenoperationen nicht mehr ausgeführt, da
die Display-Methode nicht mehr intern aufgerufen wird. Anschließend
wird mit System.exit(0) das ganze Programm geschlossen.
Soweit sogut. Nun schreiben aber die Entwickler von JOGL, das das
Stoppen des Animators und ein direkt darauf folgendes System.exit(0) zu
Problemen führen kann. Das liegt daran, das OpenGL manchmal recht
lange braucht bis es gestoppt ist, bzw. bis der Animator
fertig mit stoppen ist. Hört sich irgendwie auch Plausibel an.
Sie empfehlen folgende Veränderung in meiner Klasse:
Code:
import java.awt.event.*;
import java.awt.*;
import javax.media.opengl.*;
import com.sun.opengl.util.*;
public class JoglApp
{
public static void main(String[] args)
{
Frame fenster = new Frame("Jogl Fenster");
GLCanvas canvas = new GLCanvas();
canvas.addGLEventListener(new JoglEventListener());
final Animator anim = new Animator(canvas);
fenster.add(canvas);
fenster.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
new Thread(new Runnable()
{
public void run()
{
anim.stop();
System.exit(0);
}
}).start();
}
});
fenster.setSize(320,200);
fenster.setVisible(true);
anim.start();
}
}
Das Stoppen des Animators und das System.exit(0) wird extra nochmal in einem
2. thread verstaut. Somit sollten keine Probleme auftauchen können.
Sie schreiben folgenden Kommentar dazu:
Code:
....
// Run this on another thread than the AWT event queue to
// make sure the call to Animator.stop() completes before
// exiting
new Thread(new Runnable()
{
public void run()
{
anim.stop();
System.exit(0);
}
}).start();
...
Kann mir das bitte jemand genau erklären, wie das genau mit diesem
2. Thread gemeint ist und was die AWT-Event-Queue da mitwirkt ?
Wird der anim.stop() Befehl in einem seperaten Thread mit sicherheit
ausgeführt, und in dem Hauptprogramm nicht unbedingt ?? Es ist sehr wichtig,
ich brauche das für eine Ausarbeitung
Vielen Dank schonmal im Vorraus
Gruss
Final