我正在使用
从另一个E4应用程序中启动安装为someProgram.exe的E4应用程序调用Runtime.getRuntime()EXEC( “someProgram.exe_path”);
实际上这确实启动了someProgram.exe但是当用户在someProgram.exe应用程序中启动任何交互时,它会变得无法响应,挂起和/或冻结。 我已经尝试使用ProcessBuilder和“Runtime exec”,在这两种情况下someProgram.exe都会挂起。
我已经尝试过Runtime.getRuntime()。exec(“someProgram.exe_path”)的调用;从一个带有静态主函数的简单Java类和someProgram.exe启动并完美地按预期工作,没有挂起和正常的响应时间。
或者,我们已经使用了
Desktop.getDesktop()打开(someProgram.exe_file);
启动someProgram.exe也没有问题,但是我们想发送someProgram.exe和Desktop的启动请求的参数,但遗憾的是无法提供该功能。
此外,当使用挂起的“Runtime exec”方法时,如果我退出someProgram.exe上调用“Runtime exec”的程序,那么someProgram.exe开始工作正常并且所有挂起停止。
另外,如果我在进程中放入“Runtime exec”调用,则使用“Runtime exec”启动该线程,然后销毁该进程,然后someProgram.exe退出。
想知道E4 RCP应用程序(或someProgram.exe)是否在应用程序的“启动”或someProgram.exe的应用程序生命周期中发生了某些事情,当另一个程序调用“Runtime exec”时,该程序没有放弃它?或者,如果调用应用程序需要以另一种方式调用Runtime以允许它实质上释放控制,因为使用此过程的控制似乎不会返回到启动程序以使其完成其过程。
或者可能是否有另一种方法可以实现somePrograme.exe的启动,其中Args可以在不挂起的情况下工作。
就像我说的,someProgram.exe只有在使用进程,ProcessBuilder或“Runtime exec”从另一个RCP应用程序启动时才会挂起。调用“Runtime exec”的Java类工作正常。 Desktop.open()也可以正常工作。
提前感谢您的建议。
答案 0 :(得分:0)
解决方法是在ProcessBuilder上使用inheritIO()方法:
ProcessBuilder pb = new ProcessBuilder(commands).inheritIO();
同样有效的是:
pb.redirectInput(Redirect.INHERIT);
pb.redirectOutput(Redirect.INHERIT);
来自Java Docs:
inheritIO
public ProcessBuilder inheritIO()
Sets the source and destination for subprocess standard I/O to be the same as those of the current Java process.
This is a convenience method. An invocation of the form
pb.inheritIO()
behaves in exactly the same way as the invocation
pb.redirectInput(Redirect.INHERIT)
.redirectOutput(Redirect.INHERIT)
.redirectError(Redirect.INHERIT)
This gives behavior equivalent to most operating system command interpreters, or the standard C library function system().
Returns:
this process builder
Since:
1.7