ProcessBuilder  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
lucasmb87
What is classpath?

Membro desde: 24/03/2010 21:46:25
Mensagens: 7
Offline

Olá pessoal.
Estou com um problema gostaria de saber se alguém pode me ajudar com alguma solução. Eu preciso chamar um programa dentro do meu programa, para isso posso usar o ProcessBuilder, porém eu gostaria que as saídas (impressão de terminal) desse programa chamado fossem impressas no mesmo terminal que o programa pai chamou o processo ou então abrir um terminal novo que mostrasse as saídas do novo processo.

Alguma dica?
Obrigado
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Não tem outra saída. Você precisa criar uma thread que fique lendo o OuputStream e o ErrorStream do Process criado pelo ProcessBuilder, e imprima tudo que vier por ali no System.out.

Para facilitar, você pode definir como true a propriedade redirectErrorStreamtToOutputStream do Process.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
davidbuzatto
Moderador
[Avatar]

Membro desde: 07/08/2004 23:47:57
Mensagens: 4013
Localização: Vargem Grande do Sul - SP
Online

Oi Lucas,

Executar processos externos a JVM pode ser traiçoeiro, pois se você não consumir todos os streams de saída do processo, o processo pode "congelar" sua aplicação.
Recomendo a leitura desse artigo aqui: When Runtime.exec() won't

Nele o autor descreve a criação de uma classe (StreamGobbler) que faz exatamente o que o Vini acabou de falar.
Boa leitura.

[]´s

Seja educado. Agradeça quem te ajudou. Não custa nada.
Dúvidas de Java? Utilize o fórum! Não respondo via MP.

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Fowler)
"A vida é um escândalo, e no final dá sempre errado. O que humaniza o homem é o fracasso."

http://davidbuzatto.com.br | GitHub | uHunt | CV Lattes | Last.fm
[WWW]
lucasmb87
What is classpath?

Membro desde: 24/03/2010 21:46:25
Mensagens: 7
Offline

vc poderia me passar um exemplo de como eu poderia ficar lendo, pois a unica maneira que eu consegui fazer essas leitura foi apenas quando o precesso criado termina, ai eu consigo imprimir todas as saídas que foram geradas, mas eu preciso mostrar essas saídas em tempo real como vc disse algo que fique lendo as saídas.
davidbuzatto
Moderador
[Avatar]

Membro desde: 07/08/2004 23:47:57
Mensagens: 4013
Localização: Vargem Grande do Sul - SP
Online

Você leu o artigo que passei no post anterior? Tem um link, dá uma olhada.
Lá tem tudo isso, mas precisa ler para entender.

[]´s

Seja educado. Agradeça quem te ajudou. Não custa nada.
Dúvidas de Java? Utilize o fórum! Não respondo via MP.

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Fowler)
"A vida é um escândalo, e no final dá sempre errado. O que humaniza o homem é o fracasso."

http://davidbuzatto.com.br | GitHub | uHunt | CV Lattes | Last.fm
[WWW]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

lucasmb87 wrote:vc poderia me passar um exemplo de como eu poderia ficar lendo, pois a unica maneira que eu consegui fazer essas leitura foi apenas quando o precesso criado termina, ai eu consigo imprimir todas as saídas que foram geradas, mas eu preciso mostrar essas saídas em tempo real como vc disse algo que fique lendo as saídas.


Posso sim: When Runtime.exec() won't

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
lucasmb87
What is classpath?

Membro desde: 24/03/2010 21:46:25
Mensagens: 7
Offline

O artigo é muito bom, realmente mostra como lidar bem com chamadas de outros processos, mas eu eu ainda não consigo imprimir as minhas saidas do programa chamado em tempo real, parece que a BufferedReader bloqueia até que o programa termine e complete suas saídas! Eu posso ter entendido errado os exemplos mas eu rodando e eles e tal, mas não estou conseguindo superar esse problema.
Se alguém tiver mais alguma idéia para ajudar. Obrigado.
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

lucasmb87 wrote:O artigo é muito bom, realmente mostra como lidar bem com chamadas de outros processos, mas eu eu ainda não consigo imprimir as minhas saidas do programa chamado em tempo real, parece que a BufferedReader bloqueia até que o programa termine e complete suas saídas! Eu posso ter entendido errado os exemplos mas eu rodando e eles e tal, mas não estou conseguindo superar esse problema.
Se alguém tiver mais alguma idéia para ajudar. Obrigado.


Você usou o StreamGobbler que ele cita na última página do artigo? Não tem erro, é copiar, colar no seu projeto, usa-lo e pronto!

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
lucasmb87
What is classpath?

Membro desde: 24/03/2010 21:46:25
Mensagens: 7
Offline

o método readLine() da BufferedReader parece bloquear, pois eu coloco um System.out para imprimir imediatamente ante e depois desse método e o segundo print so é mostrado depois que todo o programa chamado termina.
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Sim, por isso o StreamGobbler é disparado com start().
Ele cria uma segunda thread.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
lucasmb87
What is classpath?

Membro desde: 24/03/2010 21:46:25
Mensagens: 7
Offline

Eu fiz um programa simples para testar, ele imprime de 1 a 10 entre cada impressão de numero ele da um sleep pequeno, o que acontece é que o classe que copiei do arquito so impreme no terminal depois o programa inteiro terminou, ou seja ele fica esperando alguns segundos ate que imprime de uma vez só 1 2 3 4 5 6 7 8 9 10.
Eu realmente preciso de alguma solução para imprimir em tempo real cada saida do program chamado!
davidbuzatto
Moderador
[Avatar]

Membro desde: 07/08/2004 23:47:57
Mensagens: 4013
Localização: Vargem Grande do Sul - SP
Online

lucasmb87 wrote:Eu fiz um programa simples para testar, ele imprime de 1 a 10 entre cada impressão de numero ele da um sleep pequeno, o que acontece é que o classe que copiei do arquito so impreme no terminal depois o programa inteiro terminou, ou seja ele fica esperando alguns segundos ate que imprime de uma vez só 1 2 3 4 5 6 7 8 9 10.
Eu realmente preciso de alguma solução para imprimir em tempo real cada saida do program chamado!

Você leu mesmo o artigo??? Vc está insistindo no mesmo problema e estamos insistindo na mesma solução! Se vc ainda está insistindo no problema é pq NÃO leu o artigo.

Seja educado. Agradeça quem te ajudou. Não custa nada.
Dúvidas de Java? Utilize o fórum! Não respondo via MP.

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Fowler)
"A vida é um escândalo, e no final dá sempre errado. O que humaniza o homem é o fracasso."

http://davidbuzatto.com.br | GitHub | uHunt | CV Lattes | Last.fm
[WWW]
lucasmb87
What is classpath?

Membro desde: 24/03/2010 21:46:25
Mensagens: 7
Offline

Sim eu li e estou usando exatamente como foi dito no artigo, o que estou tentando explicar é que não soluciona meu problema, mas o metodo readLine() bloqueia a thread que faz a impressão das saidas até que o processo termine por completo

This message was edited 1 time. Last update was at 26/07/2010 12:22:58

ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Por que você tirou o waitFor() ?

Tente usar essa classe no lugar do Gobbler:


O código fica bem parecido:



Só que essa thread não espera pelo \n, como o readLine() faz. Talvez o seu processo não tenha esse tipo de terminador.

This message was edited 2 times. Last update was at 26/07/2010 12:36:03


@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
lucasmb87
What is classpath?

Membro desde: 24/03/2010 21:46:25
Mensagens: 7
Offline

Sim, ficou claro que é um problema no terminador do processo que eu chamo!
Eu alterei o código exemplo do artigo passado e funcionou, vou testar com esse que vc passou.
Obrigado pela ajuda!
E SIM eu li o artigo!!!
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team