Java程序突然停止重新绘制并拒绝关闭

时间:2015-11-09 19:04:46

标签: java multithreading swing paintcomponent repaint

我正在制作游戏,它有一个主要重复调用游戏更新功能并调用组件重绘功能的线程(见下文)。

public void run()
{
    try {
        while(true)
        {
            b.infps++; //b is the JComponent that draws the game and also passes on the game's update steps

            long start = System.currentTimeMillis(); 
            if(start >= b.lastSec + 1000)
            {
                b.fps = b.infps;
                b.infps = 0;
                b.lastSec = start;
            }
            lastMil = start;

            if(!b.paused || b.step) //paused is when the game is paused, and step allows the game to update one frame at a time by keypress (for debugging)
            {
                b.update();
                b.step = false;
            }
            else
                b.updateWhilePaused();

            System.out.println("Running at "+Math.min(desired, Math.max(1, desired + start - finish)));
            b.repaint();
            long finish = System.currentTimeMillis();
            Thread.sleep(Math.min(desired, Math.max(1, desired + start - finish)));
        }
    } catch (InterruptedException e) {

    }
}

这已经工作了一年多了,但突然之间,我遇到了这个错误,看起来似乎整个事情都冻结了,没有再重新粉刷,也没有更多的用户互动(甚至无法关闭使用Alt + F4或按下红色X)的窗口。

起初我认为这是我创建的一些无限循环,但是当我检查时,线程仍然运行正常且花花公子,并且每隔24毫秒调用update和repaint(System.out.println仍然重复发布到eclipse的控制台)。

使用Java VisualVM工具,我尝试分析变化,我唯一能识别的是AWT-EventQueue-0在运行和等待之间停止交替,并开始不断运行。

为了绘制我的游戏,我已经覆盖了“b”的paintComponent方法,并且我已经确定不再调用它,即使b.repaint()是。我还检查过它确保它仍然在JFrame的组件层次结构中。 (我打印出b.getParentComponent()直到它到达JFrame,并且没有任何变化)。

所以我对这里发生的事情感到困惑。

0 个答案:

没有答案