关闭处理 windows 但不终止进程
Closing Processing windows but not terminate the process
我目前正在使用 Java 编写带有命令行界面的图像处理程序。我决定使用 Processing-Java 作为它的库来处理这些图像。我写了一个 class 来查看主 class 调用的那些加载的图像。但是,当我关闭 window 实例时,主进程也将终止。如何在不终止整个程序的情况下关闭 window 实例?
public static void showVolumes(List<CT_Volume> volumes) {
String[] appletArgs = { "ImageViewer" };
ImageViewer instance = new ImageViewer(volumes);
runSketch(appletArgs, instance);
}
这个静态方法被mainclass调用,它是显示CLI界面并与用户交互的驱动程序。 CT_Volume
是一个对象,用于封装一组正在使用的图像的信息,它包含一个PImage
的列表,以便图像查看器可以显示图像。当用户想查看加载到内存中的图像时,可以调用这个静态方法。我想在 window 实例终止后保留调用此静态方法的主进程。
这可能与 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 库,但我希望这个答案能为解决方案提供一些见解。
在 P2D 和 JAVA2D 渲染器模式下关闭草图调用 PApplet 实例的 exitActual()
方法,其中包含行 System.exit(0)
– 静态方法 – 终止当前 运行 Java 虚拟机.
什么都不用覆盖 exitActual()
(即阻止调用 System.exit(0)
)阻止草图关闭其他草图,解决了这个问题,但在 P2D 草图的情况下引入了另一个问题:window点击叉号时没有正确处理
解决方案:
覆盖 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);
}
我目前正在使用 Java 编写带有命令行界面的图像处理程序。我决定使用 Processing-Java 作为它的库来处理这些图像。我写了一个 class 来查看主 class 调用的那些加载的图像。但是,当我关闭 window 实例时,主进程也将终止。如何在不终止整个程序的情况下关闭 window 实例?
public static void showVolumes(List<CT_Volume> volumes) {
String[] appletArgs = { "ImageViewer" };
ImageViewer instance = new ImageViewer(volumes);
runSketch(appletArgs, instance);
}
这个静态方法被mainclass调用,它是显示CLI界面并与用户交互的驱动程序。 CT_Volume
是一个对象,用于封装一组正在使用的图像的信息,它包含一个PImage
的列表,以便图像查看器可以显示图像。当用户想查看加载到内存中的图像时,可以调用这个静态方法。我想在 window 实例终止后保留调用此静态方法的主进程。
这可能与 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 库,但我希望这个答案能为解决方案提供一些见解。
在 P2D 和 JAVA2D 渲染器模式下关闭草图调用 PApplet 实例的 exitActual()
方法,其中包含行 System.exit(0)
– 静态方法 – 终止当前 运行 Java 虚拟机.
什么都不用覆盖 exitActual()
(即阻止调用 System.exit(0)
)阻止草图关闭其他草图,解决了这个问题,但在 P2D 草图的情况下引入了另一个问题:window点击叉号时没有正确处理
解决方案:
覆盖 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);
}