Esperar o término de um processo

7 respostas
zezao

Olá… Iniciando meu primeiro tópico…

Sei que o assunto já foi bastante explorado aqui no fórum, mas não achei nada que falasse do meu problema. Vamos a ele. Tenho que executar um programa que tem um tempo de processamento razoável, e preciso esperar que ele termine para continuar meu aplicativo. No entanto, quando inicio o programa, parece que ele espera a thread principal encerrar para então fazer todo o seu processamento (depois do exec() o aplicativo fica esperando indefinidamente). Alguém sabe do que se trata, e como resolver?

String arg = "pmcc.exe";

try {
	Runtime.getRuntime().exec(arg).waitFor();
} catch (IOException e) {
	e.printStackTrace();
} catch (InterruptedException e) {
	e.printStackTrace();
}

Obrigado!

7 Respostas

ViniGodoy

Nós descobrimos um problema que ocorre no Windows. Você deve ler o output do processo, caso contrário ele não termina.

No lugar do waitfor, substitua por um while que lê o strem do seu processo até que ele se esgote (retorne -1). Só depois disso, dê o waitfor.

zezao

ViniGodoy, eu já tentei ler o output do processo, e num certo ponto ele parava do mesmo jeito. Não sei se tem a ver, mas algumas das saídas que são visualizadas na tela do command não são capturadas no programa. O engraçado é que se eu direciono a saída do processo para um txt, via DOS, nem todas as saídas são salvas, e são exatamente nessas saídas que o programa “trava”, esperando o término do processo. Você tem idéia do que seja? Obrigado pela atenção.

ViniGodoy

Você tem certeza que não é o processo que está travando?

T

Experimente redirecionar também a saída de erros de seu programa:
programa > saida 2> erro

Se dessa maneira todas as saídas forem salvas, então você precisa também capturar a "error stream". Veja na documentação como pegar essa tal de "error stream".

ViniGodoy

Bem lembrado. No caso do process, basta usar o getErrorStream().

Se no lugar do Runtime.exec você usar um ProcessBuilder, você pode usar o redirectErrorStream(true) para redirecionar o errorStream para o output padrão do processo.

zezao

Vou experimentar redirecionar os erros. Colocarei o resultado aqui. Obrigado galera.

zezao

Realmente o problema era a saída de erro. Parte da saída do programa é via STDOUT, outra parte é via STDERR. Quando o meu aplicativo tenta ler a saída padrão, sem a saída de erro, ele “trava”. Muito obrigado galera!!!

Meu problema agora é outro… Mas esse vou quebrar um pouco a cabeça. Valeu.

Criado 14 de dezembro de 2007
Ultima resposta 18 de dez. de 2007
Respostas 7
Participantes 3