Runtime - como pegar o tempo de execução?

Ola pessoal, estou usando o runtime para gravar um db, como segue no codigo abaixo:

[code]rt.exec(“cmd.exe /k mysqldump -u” + box_Usuario.getSelectedItem() + " -p" + new String(pwd_Senha.getPassword()) + " " + box_BancoDeDados.getSelectedItem() + " > " + arquivo);

Thread.sleep(1000);

JOptionPane.showMessageDialog(null, “O Backup foi gerado com sucesso!”);
[/code]

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?

Abraços

Acho que assim vai.

[code]Process p = rt.exec(“cmd.exe /k mysqldump -u” + box_Usuario.getSelectedItem() + " -p" + new String(pwd_Senha.getPassword()) + " " + box_BancoDeDados.getSelectedItem() + " > " + arquivo);

p.waitFor();

JOptionPane.showMessageDialog(null, “O Backup foi gerado com sucesso!”);[/code]

[code]long antes = System.currentTimeMillis();
Process process = rt.exec(“cmd.exe /k mysqldump -u” + box_Usuario.getSelectedItem() + " -p" + new String(pwd_Senha.getPassword()) + " " + box_BancoDeDados.getSelectedItem() + " > " + arquivo);
int returnCode = process.waitFor();
double tempo = (System.currentTimeMillis() - antes) / 1000.0;

JOptionPane.showMessageDialog(this, String.format(“O Backup foi gerado com sucesso em %.2f segundos!”, tempo));[/code]

PS: Aquele Thread.sleep foi um xunxão, hein?
PPS: Dessa vez o Erik foi mais rápido.

Alguns comentários:

  1. 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!”;
  2. É 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;
  3. 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;
  4. 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;

Bem lembrado. No caso do mysqldump, deveria mostrar a mensagem de sucesso se o retorno for 0.

O que estou fazendo de errado? Segue o meu metodo inteiro:

[code]//Seleciona local de destino
JFileChooser flc_CaminhoBackup = new JFileChooser();
flc_CaminhoBackup.setCurrentDirectory(new java.io.File("."));
flc_CaminhoBackup.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
flc_CaminhoBackup.setAcceptAllFileFilterUsed(false);
flc_CaminhoBackup.setDialogTitle(“Destino de Backup”);
flc_CaminhoBackup.showOpenDialog(flc_CaminhoBackup);
String caminhoProdutoSelecionado = flc_CaminhoBackup.getSelectedFile().getPath();

    try {
        String arquivo = caminhoProdutoSelecionado+ "/" +"banco.sql";

        if(new File(arquivo).exists()){
            //Deleta o arquivo caso o mesmo exista no diretorio
            new File(arquivo).delete();
        }
        Runtime rt = Runtime.getRuntime();
        Process p = rt.exec("cmd.exe /k mysqldump -u" + box_Usuario.getSelectedItem() + " -p" + new String(pwd_Senha.getPassword()) + " " + list_BancoDeDados.getSelectedValue() + " > " + arquivo);

        StreamRedirector red = new StreamRedirector(System.out, p.getInputStream());

        p.waitFor();
        red.stopRedirect();

        JOptionPane.showMessageDialog(null, "O Backup foi gerado com sucesso!");

    } catch (Exception exc) {
        exc.printStackTrace();
    }[/code]

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

Não está fazendo nada de errado, aparentemente.

Mas o que está dando errado? Ocorre alguma exceção?

PS. Agora foi a vez do Vini ser mais rápido.

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.

[quote=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.[/quote]

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…

Abraços