Verständis Problem zu Threads

Status
Nicht offen für weitere Antworten.

FinalbrainXP

Aktives Mitglied
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.

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
 
Ausgeführt wird "stop" in beiden Fällen. Allerdings steht in der Doku zu Animator.stop
http://download.java.net/media/jogl/builds/nightly/javadoc_public/com/sun/opengl/util/Animator.html#stop()


Stops this animator. In most situations this method blocks until completion, except when called from the animation thread itself or in some cases from an implementation-internal thread like the AWT event queue thread.


WARUM genau das so ist, kann man schwer sagen (gibt's den Source Code von JOGL (bzw. von Animator) irgendwo im Netz? Dann könnte man da mal einen Blick drauf werfen, und es evtl. (!) genauer begründen). Anhand der Doku kann man aber zumindest schonmal (nicht-formal) sowas sagen wie:

Wenn "stop" vom EventDispatchThread aus aufgerufen wird, dann wird das Stoppen nur veranlaßt - die Methode "stop" wird sofort beendet, und das eigentliche Stoppen kann später stattfinden. In diesem Fall könnte es sein, dass das stoppen NACH dem System.exit stattfinden würde (aber dann nicht mehr passieren KANN, weil ja schon geExitet wurde :roll: ). Wenn "stop" von einem separaten Thread aufgerufen wird, dann wird dieser Thread so lange blockiert, bis das Stoppen tatsächlich durchgeführt wurde, d.h. das System.exit wird garantiert erst NACH dem tatsächlichen Stoppen aufgerufen.
 
Vielen Dank für deine Mühe Maroco 🙂 Ich brauch leider genau dieses "Warum" 🙁
Im JOGL Source habe ich es noch nicht gefunden..werde mal weiter suchen 😉
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben