Chamar programa externo [RESOLVIDO]

6 respostas
gqferreira

Boa noite pessoal!

Estou tentando fazer um software que monitore a execução de outro. Por exemplo:

Runtime.getRuntime().exec("calc.exe");

Sei que isso retorna um Process.

Process p = Runtime.getRuntime().exec("calc.exe");

Agora eu queria ficar de tempo em tempo conferindo se esse software ainda está rodando.
A Thread e todo o resto eu já tenho, só to travado no “Verficar se está rodando”. Seria algo como (ilustração):

Process p = Runtime.getRuntime().exec("calc.exe"); if (p.isRuning()){ //FAZ alguma coisa... }

Vlw pessoal! :thumbup:

6 Respostas

x111

A meu ver existem duas possibilidades:

  1. Criar uma thread para cada processo chamado utilizar a funcao process.waitFor(). Assim que o programa terminar você pode notificar
  2. Chamar a função process.exitValue(), caso ela levante a IllegalThreadStateException é por que não terminou ainda.

Consulte a documentação da classe Process para maiores detalhes.

gqferreira

Humm… e acabei implementando a primeira opção mas agora que vc deu essas dicas, achei a segunda mais elegante!

Vlw! :thumbup:

x111

gqferreira:
Humm… e acabei implementando a primeira opção mas agora que vc deu essas dicas, achei a segunda mais elegante!

Vlw! :thumbup:

Bom, eu acho a primeira mais elegante. A segunda é mais fácil!

mateuscs

Poste a solução para gente.

:smiley:

(Claro se puder)

E

Bom dia pessoal,

gqferreira, siga o “conselho” do mateuscs, se puder poste ai, vai ser útil para muita gente cara.

obrigado!

x111

Como o pessoal ta pedindo vou colocar um exemplo da solução 1:

Notar que foi utilizado o padrão observer para implementação do exemplo. Isso permite que a classe Teste fique descoplada da classe ThreadProcesso, permitindo o uso desse exemplo por qualquer outra classe!
Esse é um bom exemplo do padrão observer, da utilização de threads e execução de comandos.
Ao contrário da solução 2 ela é expansivel e permite a utilização em outros projetos. Nem sempre a solução mais fácil é a melhor solução!

//Classe que executa o processo

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class ThreadProcesso extends Thread {
	private ProcessBuilder processBuilder;
	private ObservadorProcesso observador;
	
	public ThreadProcesso(ObservadorProcesso observador, File diretorio, String ...comandos){
		this.observador = observador;
		
		List<String> ListaDeComandos = new ArrayList<String>(2);

		for (String comando: comandos)
			ListaDeComandos.add(comando);
		
		processBuilder = new ProcessBuilder();
		processBuilder.command(ListaDeComandos);
		processBuilder.directory(diretorio);
	}
	
	@Override
	public void run(){
		Process processo;
		try {
			processo = processBuilder.start();
		} catch (IOException exception) {
			observador.execaoAoExecutarProcesso(exception);
			return;
		}
		
		try {
			processo.waitFor();
			observador.processoConcluido(processo);
		} catch (InterruptedException exception) {
			observador.monitoracaoInterronpida(processo, exception);
		}
	}
}
//Interface para implementação do padrão observer
package dominio;

import java.io.IOException;

public interface ObservadorProcesso {
	public void processoConcluido(Process processo);
	public void execaoAoExecutarProcesso(IOException exception);
	public void monitoracaoInterronpida(Process processo, InterruptedException exception);
}
/**
 * Classe observadora dos processos, notar que os métodos implementado de ObservadorProcesso
 * tem a palavra chave synchronized
 */

package dominio;

import java.io.IOException;

public class Teste implements ObservadorProcesso {

	public static void main(String[] args) {
		Teste testeProcessos = new Teste();
		
		ThreadProcesso threadProcesso = (new ThreadProcesso(testeProcessos, null, "notepad.exe"));
		threadProcesso.start();
		
		(new ThreadProcesso(testeProcessos, null, "calc.exe")).start();
		
		threadProcesso.interrupt();
		
	}

	@Override
	public synchronized void processoConcluido(Process processo) {
		System.out.println(String.format("Processo concluido: %s", processo.toString()));
	}

	@Override
	public synchronized void execaoAoExecutarProcesso(IOException exception) {
		exception.printStackTrace();
	}

	@Override
	public synchronized void monitoracaoInterronpida(Process processo,
			InterruptedException exception) {
		System.out.println(String.format("Monitoração do processo iterrompida: %s", processo.toString()));
		exception.printStackTrace();
	}
}
Criado 30 de agosto de 2011
Ultima resposta 31 de ago. de 2011
Respostas 6
Participantes 4