Olá pessoal. é minha primeira vez aqui
Estou desenvolvendo uma GUI para um programa em C. Como esse programa usa muita saída para reportar status, tive a idéia de chama-lo pela linha de comando através do Java com o Runtime.getRuntime().exec(cmd)... para então fazer a leitura no InputStream do processo de retorno.
O programa gera várias linhas de texto por segundo. E eu preciso ler elas continuamente para mostrar o status para o usuário.
O problema é que minha GUI lê a saída todo engasgado.... demora um tempão para mostrar alguma coisa.... então ele mostra tudo que saiu até ali de uma vez só e engasga denovo.... e tem que esperar mais uns 10 segundos(ou mais) para ver mais alguma saída aparecer.
public class CommandLineRun {
Process p;
Runtime rt;
BufferedReader stdInput, stdError;
private boolean running;
public CommandLineRun(File f,String[] args){
rt = Runtime.getRuntime();
try {
p = rt.exec(f.getCanonicalPath(), args, f.getCanonicalFile().getParentFile());
running=true;
} catch (IOException ex) {
Logger.getLogger(CommandLineRun.class.getName()).log(Level.SEVERE, null, ex);
}
stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
}
public BufferedReader getOutput(){
return stdInput;
}
public BufferedReader getError(){
return stdError;
}
public void halt(){
p.destroy();
running=false;
}
public boolean procDone() {
try {
int v = p.exitValue();
running=false;
return true;
}
catch(IllegalThreadStateException e) {
return false;
}
}
public boolean isRunning() {
return running;
}
}
public class monExatoModuleOut extends Thread {
CommandLineRun run;
public monExatoModuleOut(CommandLineRun run) {
this.run = run;
}
public void run() {
String s;
while (!run.procDone() && run.isRunning()) {
try {
while (( s = run.getError().readLine()) != null) {
System.out.println(s);
}
} catch (IOException ex) {
Logger.getLogger(execExatoModuleThread.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
O fato é que o programa que eu tenho que rodar faz uso intensivo de CPU, além leitura e escrita de dados. O meu medo é que devido a isso a thread do java que coloca os dados no InputStream esteja comprometida por causa disso... ficando engasgada por um tempão.
Alguém tem uma idéia de como solucionar isso?