Process. waitforexit java
Eu estou usando um aplicativo c # para iniciar um aplicativo da web java. Eu gostaria de meu aplicativo c # para saber quando o usuário fecha fora do aplicativo java. Eu estou usando este código:
Esse código inicia com êxito o programa java, no entanto, WaitForExit () é chamado e retorna imediatamente. Eu acredito que isso é porque "javaws" simplesmente inicia outro processo chamado "javaw" e então "javaws" é fechado. Existe alguma maneira de A) esperar por todos os processos filhos para terminar também, ou B) esperar por um processo filho específico?
Eu descobri este post relacionado: Os códigos de saída do javaws estão realmente quebrados ?, embora a resposta sugere que o 1.6.0_23 o corrigiu, estou vendo exatamente o mesmo comportamento na minha máquina de desenvolvimento com o Java 1.6.0_23. O que estou procurando agora é uma solução alternativa para fazer o código acima funcionar como esperado. Eu preciso para iniciar este arquivo jnlp, aguarde a sua execução para concluir e, em seguida, fazer algum código adicional no programa c #. A aplicação Java está fora do meu controle, então não posso adicionar a funcionalidade lá.
Para quem quer saber, a solução final é assim:
Isso fornece o benefício adicional de aguardar apenas o processo javaw iniciado mais recentemente, no caso de haver outros aplicativos da web java em execução na máquina.
Process. waitforexit java
Eu acho que você só quer isso:
Veja a página do MSDN para o método. Ele também tem uma sobrecarga onde você pode especificar o tempo limite, então você não está esperando potencialmente para sempre.
Use Process. WaitForExit? Ou assine o evento Process. Exited se não quiser bloquear? Se isso não fizer o que você deseja, forneça mais informações sobre suas necessidades.
Eu faço o seguinte na minha candidatura:
Existem alguns recursos extras que você pode achar úteis.
Você pode usar a espera para sair ou você pode pegar a propriedade HasExited e atualizar sua interface do usuário para manter o usuário "informado" (gerenciamento de expectativa):
Process. waitforexit java
Eu tenho um serviço do windows contendo este código:
A finalidade deste código é executar um extrato IFilter em um documento, usamos um processo separado porque alguns IFilters são notoriamente escamosos.
Agora este código roda perfeitamente nas caixas do Windows 7 e do Server 2008 R2, mas em um Windows Server 2003 o WaitForExit lança imediatamente uma exceção "Não há processo associado a este objeto de processo". O processo existe e conclui sua tarefa sem nenhum problema.
Alguém viu isso? Alguém pode lançar alguma luz sobre por que WaitForExit iria mostrar esse erro?
Se eu colocar este código em um aplicativo de console e executá-lo funciona bem na caixa do Windws Server 2003 também, portanto, parece ser um problema específico executando isso em um serviço em uma caixa do Windows Server 2003.
Ao iniciar processos, com a classe System. Diagnostics. Process, o sistema pode usar a função Win32 CreateProcess ou ShellExecuteEx. Ao usar o CreateProcess, somente arquivos executáveis podem ser iniciados. Ao usar ShellExecuteEx, qualquer arquivo que possa ser iniciado usando o comando "Iniciar-> Executar" a partir do shell.
No entanto, estas são formas completamente diferentes de iniciar processos. ShellExecuteEx envolve o shell e pode, por exemplo, reutilizar uma instância existente do Word ou do Excel para abrir um documento, usando as informações armazenadas sob o HKCR \ & lt; progid & gt; \ shell \ & lt; verb & gt; Chave do registro. Isso pode envolver, por exemplo, o uso de DDE para procurar e ativar uma instância existente do Excel.
Veja a documentação no SHELLEXECUTEINFO do ShellExecuteEx:
Observe que ShellExecuteEx pode ou não retornar um hProcess dependendo se um novo processo foi iniciado. Esse é o comportamento que você está vendo.
CreateProcess é uma função de nível inferior e cria um processo diretamente e simplesmente passa os argumentos equivalentes. Sempre retorna um identificador de processo.
Nota: Como você parece estar iniciando um arquivo executável, é um pouco surpreendente que nenhum hProcess seja retornado pelo ShellExecuteEx. No entanto, se você quiser garantir que você obtenha um identificador de processo, usar UseShellExecute = false é a coisa correta a ser feita.
Método Java. lang. Process. waitFor ().
Descrição.
O método java. lang. Process. waitFor () faz com que o encadeamento atual aguarde, se necessário, até que o processo representado por este objeto Process seja finalizado. Este método retorna imediatamente se o subprocesso já tiver sido finalizado. Se o subprocesso ainda não tiver sido finalizado, o encadeamento de chamada será bloqueado até que o subprocesso seja encerrado.
Declaração.
A seguir está a declaração do método java. lang. Process. waitFor ().
Parâmetros
Valor de retorno.
Este método retorna o valor de saída do processo. Por convenção, 0 indica a terminação normal.
O exemplo a seguir mostra o uso do método lang. Process. waitFor ().
Vamos compilar e executar o programa acima, isso produzirá o seguinte resultado & menos;
Process. waitforexit java
Dentro de um aplicativo que estou escrevendo, preciso fazer o seguinte:
Execute um aplicativo GUI externo (para os propósitos deste exemplo, vamos assumir o seu MS Word). Bloqueie o encadeamento atual até que o aplicativo GUI externo tenha sido fechado.
Minha primeira tentativa de fazer isso foi fazer uso do objeto System. Diagnostics. Process.
// Inicialize o objeto de processo.
myProcess. StartInfo. FileName = & quot; C: \\ Arquivos de Programas \\ Microsoft Office \\ OFFICE11 \\ Winword. exe & quot ;;
myProcess. StartInfo. WorkingDirectory = & quot; C: \\ Arquivos de Programas \\ Microsoft Office \\ OFFICE11 & quot ;;
// Inicie o processo e espere que ele seja fechado.
System. Windows. Forms. MessageBox. Show (& quot; Aplicativo do usuário fechado & quot;);
Quando executo o código acima, o MS Word é iniciado conforme o esperado. No entanto, a chamada WaitForExit () não parece estar fazendo seu trabalho como eu obter o instantâneo de caixa de mensagem instantaneamente após o processo do MS Word é iniciado e não depois que ele for fechado.
Por que a chamada WaitForExit () não aguarda o término do processo do MSWord? O fato de eu estar lançando um aplicativo GUI em vez de um aplicativo de linha de comando é significativo?
Qualquer ajuda seria muito apreciada.
Todas as respostas.
Depois de alguns testes conclui que é porque não há um documento do usuário carregado. se você tornar o parâmetro filename um documento real, tudo funcionará como esperado:
// Inicie o processo e espere que ele seja fechado.
System. Windows. Forms. MessageBox. Show (& quot; Aplicativo do usuário fechado & quot;);
Se um documento é carregado ou não, não importa? O objeto Process fornece apenas uma maneira genérica de executar e monitorar processos, ele não sabe nada sobre as partes internas do que o Word carregou com segurança?
Em qualquer caso, tentei o código conforme recomendado e recebi uma exceção "Nenhum processo associado a este objeto", presumivelmente porque foi passado o nome do arquivo de um documento em vez de um executável.
Eu acho que você só quer isso:
Veja a página do MSDN para o método. Ele também tem uma sobrecarga onde você pode especificar o tempo limite, então você não está esperando potencialmente para sempre.
Use Process. WaitForExit? Ou assine o evento Process. Exited se não quiser bloquear? Se isso não fizer o que você deseja, forneça mais informações sobre suas necessidades.
Eu faço o seguinte na minha candidatura:
Existem alguns recursos extras que você pode achar úteis.
Você pode usar a espera para sair ou você pode pegar a propriedade HasExited e atualizar sua interface do usuário para manter o usuário "informado" (gerenciamento de expectativa):
Process. waitforexit java
Eu tenho um serviço do windows contendo este código:
A finalidade deste código é executar um extrato IFilter em um documento, usamos um processo separado porque alguns IFilters são notoriamente escamosos.
Agora este código roda perfeitamente nas caixas do Windows 7 e do Server 2008 R2, mas em um Windows Server 2003 o WaitForExit lança imediatamente uma exceção "Não há processo associado a este objeto de processo". O processo existe e conclui sua tarefa sem nenhum problema.
Alguém viu isso? Alguém pode lançar alguma luz sobre por que WaitForExit iria mostrar esse erro?
Se eu colocar este código em um aplicativo de console e executá-lo funciona bem na caixa do Windws Server 2003 também, portanto, parece ser um problema específico executando isso em um serviço em uma caixa do Windows Server 2003.
Ao iniciar processos, com a classe System. Diagnostics. Process, o sistema pode usar a função Win32 CreateProcess ou ShellExecuteEx. Ao usar o CreateProcess, somente arquivos executáveis podem ser iniciados. Ao usar ShellExecuteEx, qualquer arquivo que possa ser iniciado usando o comando "Iniciar-> Executar" a partir do shell.
No entanto, estas são formas completamente diferentes de iniciar processos. ShellExecuteEx envolve o shell e pode, por exemplo, reutilizar uma instância existente do Word ou do Excel para abrir um documento, usando as informações armazenadas sob o HKCR \ & lt; progid & gt; \ shell \ & lt; verb & gt; Chave do registro. Isso pode envolver, por exemplo, o uso de DDE para procurar e ativar uma instância existente do Excel.
Veja a documentação no SHELLEXECUTEINFO do ShellExecuteEx:
Observe que ShellExecuteEx pode ou não retornar um hProcess dependendo se um novo processo foi iniciado. Esse é o comportamento que você está vendo.
CreateProcess é uma função de nível inferior e cria um processo diretamente e simplesmente passa os argumentos equivalentes. Sempre retorna um identificador de processo.
Nota: Como você parece estar iniciando um arquivo executável, é um pouco surpreendente que nenhum hProcess seja retornado pelo ShellExecuteEx. No entanto, se você quiser garantir que você obtenha um identificador de processo, usar UseShellExecute = false é a coisa correta a ser feita.
Método Java. lang. Process. waitFor ().
Descrição.
O método java. lang. Process. waitFor () faz com que o encadeamento atual aguarde, se necessário, até que o processo representado por este objeto Process seja finalizado. Este método retorna imediatamente se o subprocesso já tiver sido finalizado. Se o subprocesso ainda não tiver sido finalizado, o encadeamento de chamada será bloqueado até que o subprocesso seja encerrado.
Declaração.
A seguir está a declaração do método java. lang. Process. waitFor ().
Parâmetros
Valor de retorno.
Este método retorna o valor de saída do processo. Por convenção, 0 indica a terminação normal.
O exemplo a seguir mostra o uso do método lang. Process. waitFor ().
Vamos compilar e executar o programa acima, isso produzirá o seguinte resultado & menos;
Process. waitforexit java
Dentro de um aplicativo que estou escrevendo, preciso fazer o seguinte:
Execute um aplicativo GUI externo (para os propósitos deste exemplo, vamos assumir o seu MS Word). Bloqueie o encadeamento atual até que o aplicativo GUI externo tenha sido fechado.
Minha primeira tentativa de fazer isso foi fazer uso do objeto System. Diagnostics. Process.
// Inicialize o objeto de processo.
myProcess. StartInfo. FileName = & quot; C: \\ Arquivos de Programas \\ Microsoft Office \\ OFFICE11 \\ Winword. exe & quot ;;
myProcess. StartInfo. WorkingDirectory = & quot; C: \\ Arquivos de Programas \\ Microsoft Office \\ OFFICE11 & quot ;;
// Inicie o processo e espere que ele seja fechado.
System. Windows. Forms. MessageBox. Show (& quot; Aplicativo do usuário fechado & quot;);
Quando executo o código acima, o MS Word é iniciado conforme o esperado. No entanto, a chamada WaitForExit () não parece estar fazendo seu trabalho como eu obter o instantâneo de caixa de mensagem instantaneamente após o processo do MS Word é iniciado e não depois que ele for fechado.
Por que a chamada WaitForExit () não aguarda o término do processo do MSWord? O fato de eu estar lançando um aplicativo GUI em vez de um aplicativo de linha de comando é significativo?
Qualquer ajuda seria muito apreciada.
Todas as respostas.
Depois de alguns testes conclui que é porque não há um documento do usuário carregado. se você tornar o parâmetro filename um documento real, tudo funcionará como esperado:
// Inicie o processo e espere que ele seja fechado.
System. Windows. Forms. MessageBox. Show (& quot; Aplicativo do usuário fechado & quot;);
Se um documento é carregado ou não, não importa? O objeto Process fornece apenas uma maneira genérica de executar e monitorar processos, ele não sabe nada sobre as partes internas do que o Word carregou com segurança?
Em qualquer caso, tentei o código conforme recomendado e recebi uma exceção "Nenhum processo associado a este objeto", presumivelmente porque foi passado o nome do arquivo de um documento em vez de um executável.
Dentro de um aplicativo que estou escrevendo, preciso fazer o seguinte:
Execute um aplicativo GUI externo (para os propósitos deste exemplo, vamos assumir o seu MS Word). Bloqueie o encadeamento atual até que o aplicativo GUI externo tenha sido fechado.
Minha primeira tentativa de fazer isso foi fazer uso do objeto System. Diagnostics. Process.
// Inicialize o objeto de processo.
myProcess. StartInfo. FileName = & quot; C: \\ Arquivos de Programas \\ Microsoft Office \\ OFFICE11 \\ Winword. exe & quot ;;
myProcess. StartInfo. WorkingDirectory = & quot; C: \\ Arquivos de Programas \\ Microsoft Office \\ OFFICE11 & quot ;;
// Inicie o processo e espere que ele seja fechado.
System. Windows. Forms. MessageBox. Show (& quot; Aplicativo do usuário fechado & quot;);
Quando executo o código acima, o MS Word é iniciado conforme o esperado. No entanto, a chamada WaitForExit () não parece estar fazendo seu trabalho como eu obter o instantâneo de caixa de mensagem instantaneamente após o processo do MS Word é iniciado e não depois que ele for fechado.
Por que a chamada WaitForExit () não aguarda o término do processo do MSWord? O fato de eu estar lançando um aplicativo GUI em vez de um aplicativo de linha de comando é significativo?
Qualquer ajuda seria muito apreciada.
Todas as respostas.
Depois de alguns testes conclui que é porque não há um documento do usuário carregado. se você tornar o parâmetro filename um documento real, tudo funcionará como esperado:
// Inicie o processo e espere que ele seja fechado.
System. Windows. Forms. MessageBox. Show (& quot; Aplicativo do usuário fechado & quot;);
Se um documento é carregado ou não, não importa? O objeto Process fornece apenas uma maneira genérica de executar e monitorar processos, ele não sabe nada sobre as partes internas do que o Word carregou com segurança?
Em qualquer caso, tentei o código conforme recomendado e recebi uma exceção "Nenhum processo associado a este objeto", presumivelmente porque foi passado o nome do arquivo de um documento em vez de um executável.
Комментариев нет:
Отправить комментарий