Ola pessoal, estou usando o runtime para gravar um db, como segue no codigo abaixo:
rt.exec("cmd.exe /k mysqldump -u"+box_Usuario.getSelectedItem()+" -p"+newString(pwd_Senha.getPassword())+" "+box_BancoDeDados.getSelectedItem()+" > "+arquivo);Thread.sleep(1000);JOptionPane.showMessageDialog(null,"O Backup foi gerado com sucesso!");
O problema ai, é como voces veem, eu devo colocar um sleep necessario antes de mostrar o JOptionPane e acabar o metodo em que esse runtime esta executando..
Ou seja, um banco pequeno de 200 KB estou gerando, mas se fosse maior nao iria gerar...
Como faço para saber quando que o runtime acabou de executar o comando especificado nele?
Processp=rt.exec("cmd.exe /k mysqldump -u"+box_Usuario.getSelectedItem()+" -p"+newString(pwd_Senha.getPassword())+" "+box_BancoDeDados.getSelectedItem()+" > "+arquivo);p.waitFor();JOptionPane.showMessageDialog(null,"O Backup foi gerado com sucesso!");
ViniGodoy
longantes=System.currentTimeMillis();Processprocess=rt.exec("cmd.exe /k mysqldump -u"+box_Usuario.getSelectedItem()+" -p"+newString(pwd_Senha.getPassword())+" "+box_BancoDeDados.getSelectedItem()+" > "+arquivo);intreturnCode=process.waitFor();doubletempo=(System.currentTimeMillis()-antes)/1000.0;JOptionPane.showMessageDialog(this,String.format("O Backup foi gerado com sucesso em %.2f segundos!",tempo));
PS: Aquele Thread.sleep foi um xunxão, hein?
PPS: Dessa vez o Erik foi mais rápido.
ViniGodoy
Alguns comentários:
O método waitFor() retorna o código de saída do processo. Muitas aplicações podem retornar códigos de erro, verifique se esse não é o caso. Aí vc poderia dar uma mensagem como “o backup falhou!”;
É possível ler a saída padrão da aplicação que você executou com exec. Nesse post tem uma classe que ajuda nessa tarefa. Isso permite que você logue ou mostre para o usuário o que a aplicação jogar no console;
Algumas aplicações não encerram até que você leia o que tem na sua saída padrão. Nesse caso, use a classe acima nem que seja só para esvaziar a saída do processo;
Importante: No JOptionPane forneça como primeiro parâmetro a janela que está abrindo o JOptionPane. Isso é “this” na maior parte dos casos ou “NomeDaJanela.this” se você estiver numa inner class. Caso você não faça isso, o comportamento do seu sistema vai ficar esquisito no alt+tab;
Eric_Yuzo
Bem lembrado. No caso do mysqldump, deveria mostrar a mensagem de sucesso se o retorno for 0.
blackfalcon
O que estou fazendo de errado? Segue o meu metodo inteiro:
//Seleciona local de destinoJFileChooserflc_CaminhoBackup=newJFileChooser();flc_CaminhoBackup.setCurrentDirectory(newjava.io.File("."));flc_CaminhoBackup.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);flc_CaminhoBackup.setAcceptAllFileFilterUsed(false);flc_CaminhoBackup.setDialogTitle("Destino de Backup");flc_CaminhoBackup.showOpenDialog(flc_CaminhoBackup);StringcaminhoProdutoSelecionado=flc_CaminhoBackup.getSelectedFile().getPath();try{Stringarquivo=caminhoProdutoSelecionado+"/"+"banco.sql";if(newFile(arquivo).exists()){//Deleta o arquivo caso o mesmo exista no diretorionewFile(arquivo).delete();}Runtimert=Runtime.getRuntime();Processp=rt.exec("cmd.exe /k mysqldump -u"+box_Usuario.getSelectedItem()+" -p"+newString(pwd_Senha.getPassword())+" "+list_BancoDeDados.getSelectedValue()+" > "+arquivo);StreamRedirectorred=newStreamRedirector(System.out,p.getInputStream());p.waitFor();red.stopRedirect();JOptionPane.showMessageDialog(null,"O Backup foi gerado com sucesso!");}catch(Exceptionexc){exc.printStackTrace();}
Ate o "rt.exec" funciona, pois o arquivo é criado normalmente.
Nao sei se o que eu estou fazendo é realmente isso, mas eu queria apenas saber quando ele tiver sido criado totalmente para depois poder mostrar o joptionpane..
Abraços
ViniGodoy
Não está fazendo nada de errado, aparentemente.
Eric_Yuzo
Mas o que está dando errado? Ocorre alguma exceção?
PS. Agora foi a vez do Vini ser mais rápido.
ViniGodoy
Outra coisa, por que você está chamando cmd.exe? Não era mais fácil chamar direto o mysqldump?
O que pode estar ocorrendo é ele esperar só o cmd.exe, e esse rodar num tempo diferente do mysqldump.
blackfalcon
ViniGodoy:
Outra coisa, por que você está chamando cmd.exe? Não era mais fácil chamar direto o mysqldump?
O que pode estar ocorrendo é ele esperar só o cmd.exe, e esse rodar num tempo diferente do mysqldump.
Agora parou de travar mas ainda nao esta do jeito que quero hehe
Mas vou dar uma olhada novamente e caso nao funcionar, volto aqui…