关闭处理窗口但不终止进程

时间:2021-07-09 12:51:01

标签: java processing

我目前正在使用 Java 编写带有命令行界面的图像处理程序。我决定使用 Processing-Java 作为它的库来处理这些图像。我写了一个类来查看主类调用的那些加载的图像。但是,当我关闭窗口实例时,主进程也将终止。如何在不终止整个程序的情况下关闭窗口实例?

    public static void showVolumes(List<CT_Volume> volumes) {
        String[] appletArgs = { "ImageViewer" };
        ImageViewer instance = new ImageViewer(volumes);
        runSketch(appletArgs, instance);
    }

这个静态方法由主类调用,主类是显示CLI界面并与用户交互的驱动程序。 CT_Volume 是一个对象,用于封装一组正在使用的图像的信息,它包含一个 PImage 列表,以便图像查看器可以显示图像。当用户想查看加载到内存中的图像时,可以调用这个静态方法。我想在窗口实例终止后保留调用这个静态方法的主进程。

2 个答案:

答案 0 :(得分:1)

在 P2D 和 JAVA2D 渲染器模式下关闭草图会调用 PApplet 实例的 exitActual() 方法,其中包含行 System.exit(0) – 一个静态方法 – 终止当前运行的 Java 虚拟机。

无所事事地覆盖 exitActual()(即阻止对 System.exit(0) 的调用)可防止草图关闭其他草图,从而解决问题,但在 P2D 草图的情况下引入了另一个问题:窗口未正确放置当点击十字时。

解决方案:

覆盖 exitActual() 以防止 JVM(和所有草图)在一个草图关闭时关闭。

@Override
public void exitActual() {
}

引入以下代码(适用于setup()),以便正确处理 P2D 草图:

if (getGraphics().isGL()) {
        final com.jogamp.newt.Window w = (com.jogamp.newt.Window) getSurface().getNative();
        w.setDefaultCloseOperation(WindowClosingMode.DISPOSE_ON_CLOSE);
}

答案 1 :(得分:0)

这可能与 Java 进程如何处理从终端发送的终止信号有关。终端在关闭时向与其关联的所有进程发送 SIGHUP 信号。

尝试从进程中分割终端时,通常有 2 个选项。您可以使用 disown 命令从终端对进程进行分段,也可以尝试通过使用 nohup 命令启动进程来忽略终止信号。

我相信是发送到 JVM 进程的 SIGHUP 信号导致了您的问题。请参阅 gnu 页面上的 SIGHUP:https://www.gnu.org/software/libc/manual/html_node/Termination-Signals.html

要否认已启动的流程,我会推荐来自 TechAdmin 的教程(非常简单)https://tecadmin.net/close-terminal-without-killing-running-processes-on-linux/

总结:

 kill -STOP <PID OF PROCESS>
 bg
 jobs -l         # To find the job ID of the process (Optional)
 disown -h %1    # Where 1 specifies the first running process
                 # (Or you can specify the JOB ID)

第二个选项可能是使用 nohup 命令来启动命令。 nohup 将在发送到进程时忽略 SIGHUP 信号。

nohup java -jar yourJar.jar &

其中nohup在发送给进程时忽略SIGHUP信号,&在后​​台运行进程启动。

注意:此答案是从 Linux 的角度编写的,重点介绍终端如何启动和管理进程。我没有使用过 Java-Processing 库,但我希望这个答案能够为解决方案提供一些见解。

相关问题