Java运行时延迟执行程序

时间:2015-01-09 13:54:22

标签: java python swing process

我的JButton有一个被覆盖的actionPerformed(event)功能,如下所示:

public void actionPerformed(ActionEvent event) {
    try {
        System.out.println("enters here");
        Process p = Runtime.getRuntime().exec("python tetris.py");
    } catch (Exception ex) {
        System.err.println("error");
    }
}

此代码的问题在于Python子程序在执行Java程序时开始,因此子进程的控制台(显示为全屏)缩小到较小的大小。所以我决定在执行后续过程之前终止Java程序:

public void actionPerformed(ActionEvent event) {
    try {
        System.out.println("enters here");
        Process p = Runtime.getRuntime().exec("python tetris.py");
        System.exit(0);
    } catch (Exception ex) {
        System.err.println("error");
    }
}

这提出了一个更新的问题 - 尽管后续进程确实显示为全屏,因为Java程序在tetris.py完全执行之前终止,两个进程之间存在延迟,导致桌面内容闪烁一秒在tetris.py开始运行之前。此时,我使用了waitFor()

public void actionPerformed(ActionEvent event) {
    try {
        System.out.println("enters here");
        Process p = Runtime.getRuntime().exec("python tetris.py");
        p.waitFor();
        System.exit(0);
    } catch (Exception ex) {
        System.err.println("error");
    }
}

事实证明,waitFor()等待子进程终止,这与第一个场景中的问题相同,因为子进程控制台的大小已缩小。

我的目标是以下之一:

  1. 要么找到一种方法让子进程以全屏模式执行(它自己这样做)。

  2. 如果子进程正确执行,父进程(Java程序)可以终止,但我需要摆脱两个进程之间的延迟。

  3. 我更喜欢终止Java程序的选项,因为当我使用JPanel从子进程切换回自己的进程时,所有JButton的位置都搞砸了,因此无论如何都需要新的执行。任何投入都将受到赞赏。

    更新

    laune建议没有完全正常工作,ProcessBuilder似乎只要点击JButton就会生效,但我从那里得到了一个想法。我没有检查子进程的状态,而是将Java进程暂停一段时间(实验值位于Python程序在较小窗口中执行的点与Java程序过早终止以产生延迟时间之间)

    public void actionPerformed(ActionEvent event) {
        try {
            ProcessBuilder pb = new ProcessBuilder("python", "tetris.py");
            Process p = pb.start();
            Thread.sleep(300);          // less than 315 ~ 320 transition
            System.exit(0);
        } catch (Exception ex) {
            System.err.println("error");
        }
    }
    

    然而,无论我使用什么价值,我都无法完美地转换,桌面内容会短暂闪烁,但延迟比之前更短。为了进一步抵消这种情况,我想把桌面设置为黑色以使它看起来没有被显示,但这显然不是一种空闲的方法 - 它取决于处理器的性能,因此具有较差的可移植性,更不用说这不能提供问题的真正解决方案。任何进一步的指示将不胜感激。

2 个答案:

答案 0 :(得分:0)

您可以尝试

ProcessBuilder pb = new ProcessBuilder("python", "tetris.py" );
Process p = pb.start();
while( ! p.isAlive() ){
    Thread.sleep( 10 );
}
System.exit(0);

答案 1 :(得分:0)

您需要全屏,请使用setFullScreen全屏显示。尽量避免使用像你那样的解决方法。他们几乎总是会导致其他错误和变通办法,最终导致您的应用无法维护。

我无法测试它,但我希望它适合你。

此外,如果您真的必须按照自己的方式进行操作,则不应使用System.exit(0),而应使用Platform.exit()