我正在尝试从eclipse c/c++ .exe
(Java API)运行我的RCP
。
代码:
package com.jkt.rcp.texteditor.handlers;
import java.io.IOException;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
//import com.jkt.runner.utils.Test;
public class RecordHandler extends AbstractHandler {
private RecordingThread recordingThread;
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
System.out.println("inside RecordHandler...");
recordingThread = new RecordingThread();
recordingThread.start();
return null;
}
}
RecordingThread.java
的代码是:
package com.jkt.rcp.texteditor.handlers;
import java.io.IOException;
public class RecordingThread extends Thread {
private String file = "C:\\workspace\\JProAcceptanceBot\\Record.exe";
public void run() {
System.out.println("inside Run()...");
try {
Process proc = Runtime.getRuntime().exec(file);
} catch (IOException e) {
System.out.println("IOException:"+e);
e.printStackTrace();
}
}
}
点击日食RecordHandler.java
按钮后,实际上RCP
会执行
但是当我单击按钮时,c/c++ exe
没有响应,我的Java程序停止响应
否则如果我在我的日食中运行这个exe
,它运行正常。
这个c/c++ exe
是通过使用Eclipse CDT和Cygwin完成的。
请查看代码并提出建议?
答案 0 :(得分:1)
我不确定,但您可能希望立即开始阅读通过proc.GetInputStream()获得的proc
输入流。 In the documentation for Process
:
所有标准的io(即stdin, stdout,stderr)运营将是 重定向到父进程 通过三个流 (Process.getOutputStream(), Process.getInputStream() Process.getErrorStream())。父母 进程使用这些流来提供 输入并从中获取输出 子。 因为有些原生 平台只提供有限的缓冲区 标准输入和输出的大小 溪流,未能及时写出来 输入流或读取输出流 子进程可能会导致 subprocess to block,甚至 死锁。强>
This article on javaworld描述了同样的问题并解释了解决方案(第3页)。
答案 1 :(得分:0)
请注意Sun bug 6468220(也在bug 6550942和bug 6511002中说明):
在Windows平台上,Runtime.exec(String [] cmdarray)无法正确传递命令行参数,如果其中一个包含双引号(“)。
Passing/Expected --> Actual
{ "ab\"c", "d\"ef" } --> { "abc def" }
{ "a b \" c", "d \" e f" } --> { "a b ", "c d", "e f " }
{ "a", "", "b" } --> { "a", "b" }
{ "\" a" } --> java.lang.IllegalArgumentException
所以我的问题是:你试图执行的命令行是什么?