问题从另一个Java应用程序--WindowsOS中使用Args启动E4 RCP exe

时间:2017-07-20 10:07:01

标签: rcp lifecycle runtime.exec e4 launching-application

我正在使用

从另一个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()也可以正常工作。

提前感谢您的建议。

  • 马福

1 个答案:

答案 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