Runtime

Pessoal to tendo o seguinte problema. Eu criei dois executaveis(c++) para demonstrar o problema. Veja os códigos abaixo:



========
Codigo 1 - C++

int main(int argc, char* argv[])
{
	
	ofstream out;

	for (int i=0; i < 100000; i++)
	{
		printf("A\n");
	}

	out.open("hello.txt", ios::out);
	out << "Testando o arquivo" << argv[1];

	out.close();

	return 1;
}  
=======
Codigo 2 - C++

int main(int argc, char* argv[])
{
	
	ofstream out;

	for (int i=0; i < 100; i++)
	{
		printf("A\n");
	}

	out.open("hello.txt", ios::out);
	out << "Testando o arquivo" << argv[1];

	out.close();

	return 1;
}  

=======
Abaixo segue o código java para realizar a chamada do arquivo executavel do C++.

public void executeSolver()
{
	try 
	{
		Process p = Runtime.getRuntime().exec("C:\\teste\\hello bugado");
						
	} 
	catch (IOException e) 
	{
		e.printStackTrace();
	}
}

Obs: Os códigos C++ diferem no número de iterações do for.

Quando no codigo Java é feita a chamada para o código 1 do C++ que possui a maior interação acontece um problema, o processo que é criado não é finalizado. Com isso o arquivo de saída não é gerado. No momento que a aplição Java é fechada o processo é fechado automaticamente e o arquivo de saída gerado.

Este problema acima não ocorre quando o número de iterações do for é menor. O processo é iniciado e finalizado logo em seguida, sendo o arquivo gerado normalmente sem ser necessario fechar a aplição Java.

Alguem sabe o que esta acontecendo? Sabem me dizer qual seria uma possível solução para este problema?

Abraço

Sobre a referência de Process tu consegue pegar os InputStreams de saída do programa e de erro (ErrorStream). Captura estes e manda mostrar pra ver se tem algo errado. Ainda sobre o Process tu podes invocar o método destroy para terminá-lo se achar necessário. T+

Ai galera o problema que ocorria era o seguinte. Existe um buffer para a saída padrão e como ele não era descarregado acontecia dele estourar. Quando isso acontecia o processo não era finalizado e não ocorria nenhum erro. A solução foi desviar a saída padrão do c++ para o java e imprimir com println.

Abaixo vai um link de uma matéria muito boa sobre isso.
When Runtime.exec() won’t