Controlar Execução de Uma aplicação externa

Olá Pessoal do Guj, tudo bom ??

Gostaria de saber se alguém sabe como consigo saber se uma aplicação(ex:AcrobatReader) foi finalizada pelo usuário ?? Essa aplicação foi disparada pelo meu programa, mas ateh o momento naum consegui descobrir como saber em que exato momento o usuário irá fechar essa aplicação ? Alguém sabe me informar se é possível fazer isso ??

Um abraço a todos…
Jeferson…

Olá

Se você fizer simplesmente assim:[code]public class Teste1 {

public static void main(String[] args) {
try {
Runtime run = Runtime.getRuntime();
Process processo = run.exec(“D:\Arquivos de programas\Adobe\Acrobat 6.0\Reader\AcroRd32.exe apresentacao_jdo.pdf”);

} catch(Exception e) {
  e.printStackTrace();
}

}
}[/code]

O Acrobat Reader será chamado mas o programa fecha logo e vc não fica sabendo quando o usuário fechou o reader.

Mas se você colocar em um arquivo .bat um programinha seu que seja executado depois do reader e que envie uma mensagem por socket ao seu programa na hora em que ele executar então vc fixará sabendo quando o reader terminou pois o tal programinha só entra depois do reader.

Exemplos:
Arquivo testeexec.bat: "D:\Arquivos de programas\Adobe\Acrobat 6.0\Reader\AcroRd32.exe" apresentacao_jdo.pdf java seu_programinha

[code]public class Teste2 {

public static void main(String[] args) {
try {
Runtime run = Runtime.getRuntime();
Process processo = run.exec(“testeexec.bat”);

} catch(Exception e) {
  e.printStackTrace();
}

}
}[/code]

[]s
Luca

Isso é meio complicado, mesmo se você fizesse seu programa em C++ e usasse as APIs do Windows ia apanhar um pouco. Em Java não sei lhe dizer (sem ter de usar JNI, é claro!)

P.S. Não tinha visto a solução do Luca. Legal, vou tentar

Lucas a solução parece ser boa, mas eh que este código eh executado em um Applet assinado digitalmente, com todas as permissões para escrever e ler na máquina do usuário, e fazer o “download” de um .bat para a máquina do cara pra fazer isso seria um pouco estranho. Outra gravidade, eh que teríamos que realizar um .sh para o caso de este applet estar executando sobre linux…
Será que naum tem outra possibilidade ??

Olá

A execução do reader é feito em um processo separado. Tudo que você fizer dentro do seu programa Java será feito em paralelo com o processo do reader. O único meio é vc colocar a monitoração fora da sua applet.

Ou então partir para o que disse o thingol e ficar monitorando todos os processos em execução na máquina com ps no Linux, pslist do sysinternals no Windows ou usando a API do Windows em C chamado com JNI. Para o Windows veja http://www.sysinternals.com/ntw2k/freeware/procexp.shtml

[]s
Luca

Gente… perai, que complicacao insana toda foi essa?

O Runtime.exec() retorna uma referencia a um objeto Process! :smiley:

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runtime.html
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Process.html

O Process, por sua vez, tem uns metodos muito bacanas, como por exemplo waitFor(), que faz a thread atual parar ate que a aplicacao seja finalizada. Pra evitar de ficar com a app totalmente morta enquanto o acrobat executa, voce pode iniciar uma thread, abrir o acrobat, dar um waitFor(), e logo na sequencia sinalizar a sua aplicacao com um notify() ou usando uma fila de eventos, e pronto :wink:

Puxa, não tinha lembrado do waitFor.

Como de costume, se você estiver usando uma applet, não se esquecer de:

  • Assinar a applet

  • Ver se você pode usar o plugin da Sun, ou se você tem de usar o plugin da Microsoft

  • chamar os métodos de autorização, se você tiver de chamar os métodos a partir de init(), start(), stop() - no MSJVM é algo como PolicyEngine.assertPermission(PermissionID.SYSTEM), e no Sun Plugin, algo como System.setSecurityManager(new MySecurityManager()), onde MySecurityManager é uma classe como:

import java.security.Permission;
class MySecurityManager extends SecurityManager {
        public void checkPermission(Permission perm, Object context) {
        }
        public void checkPermission(Permission perm) {
        }
}

(só assinar o applet não adianta)

  • ver se você pode usar a API no plugin da Microsoft (por sorte, waitFor existe no JDK antigo …)

Olá Pessoal…
Agradeço muito pelo empenho de todos por estarem enviando suas sugestões…
Porém tentei utilizar o método waitFor() da classe Process e ele não faz oq deveria fazer, ou seja, travar a aplicação ateh que, por exemplo o Acrobat seja fechado pelo usuário…

Um dos exemplos que estou testando eh esse:

Process process = Runtime.getRuntime().exec(“nautilus /home/jeferson/docs/jmx.pdf”);
process.waitFor();

System.out.println(“Aplicativo Fechado”);

Nesse exemplo eu uso o nautilus (Gerenciador de aplicativos padrão do GNOME) para disparar o programa padrão do sistema operacional asociado ao tipo de arquivo que se deseja abrir. No meu caso estou utilizando o fedora Core 2.
Mesmo colocando o waitFor() depois de disparar o comando meu programa logo após imprime a mensagem no console indicando que o processo jah terminou, porém o aplicativo(no meu caso o AcrobatReader) ainda continua aberto…

Alguém tem alguma sugestão ??

Um abraço a todos…

Puxa, e se você tentar chamar diretamente o executável do Acrobat (no Linux não sei onde ele fica instalado - estou sem acesso ao Linux agora), em vez de dispará-lo com o Nautilus?
Dê uma olhada com ps -ef, é bem capaz da instância do Nautilus que foi usada para iniciar o Acrobat (é o Acrobat mesmo, ou é o xpdf?) tenha já sido destruída, quando o Acrobat entrar no ar. waitFor só tem a responsabilidade de esperar pelo nautilus, não pelo Adobe Acrobat Reader, do jeito que você fez.

Thingol, realizei o teste fazendo a chamada diretamente ao AcrobatReader, porém, acontece o mesmo do que quando eu estava utilizando o nautilus…
Ficou assim :

Process process = Runtime.getRuntime().exec("/opt/Acrobat5/bin/acroread /home/jeferson/docs/jmx.pdf");
process.waitFor();

System.out.println(“Aplicativo Fechado”);

Jah pesquisei em diversas fontes, mas ateh agora naum encontrei nenhuma coisa que seja possível resolver este problema…

Conto com a comunidade para resolver esta solução e caso, alguém de nós consiga resolver isso, peço que postem a solução aqui no fórum para compartilharmos o conhecimento com todos aqueles que buscam aprender java…

Um abraço a todos…