【问题标题】:Gracefully shutting down a Java OpenGL (JOGL) app优雅地关闭 Java OpenGL (JOGL) 应用程序
【发布时间】:2010-06-22 14:37:30
【问题描述】:

我有一个带有 JOGL 组件的应用程序。当它使用 System.exit(0) 关闭时,我经常收到异常:

java.lang.InterruptedException
at java.lang.Object.wait(Native Method)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
at sun.java2d.Disposer.run(Disposer.java:125)
at java.lang.Thread.run(Thread.java:619)

我已经看到这个问题Occasional InterruptedException when quitting a Swing application,但我没有运行任何非守护线程。我想知道底层的 JOGL 代码是否不断地将事件放入 swing 事件队列中,这可能会导致此错误,因为 swing 应用程序只会在事件队列为空时正确关闭。

有没有办法更干净地关机?也许以某种方式停止 JOGL 主循环(我使用的是 3rd 方工具,nasa worldwind,所以我不一定有权访问运行应用程序的主 Animator)。

编辑:事实证明这根本不是 openGL 问题。 OpenGL 正在正确关闭,而我正在运行的关闭挂钩中只是一场比赛。谢谢。

【问题讨论】:

    标签: java swing opengl shutdown interrupted-exception


    【解决方案1】:

    来自JOGL wiki page

    import java.awt.Frame;
    import com.sun.opengl.util.Animator;
    
    // ...
    
    frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                exit();
            }
            });
    
    // ...
    
    public static void exit(){
        animator.stop();
        frame.dispose();
        System.exit(0);
    }
    

    【讨论】:

      【解决方案2】:

      确保在调用 System.exit() 之前停止所有开始的操作;

      如果您使用

      启动动画师

      Animator anim = new Animator(canvas); 动画.start();

      请务必在退出程序之前调用 anim.stop()

      【讨论】:

      • 我没有启动任何动画师,但可能是 worldwind openGL 代码。我正试图追踪它。 GLAutoDrawable 中的显示方法是否应该检查它是否已关闭以仅从该方法返回?
      【解决方案3】:

      事实证明,这根本不是 openGL 问题。 OpenGL 正在正确关闭,而我正在运行的关闭挂钩中只是一场比赛。谢谢。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-11
        相关资源
        最近更新 更多