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

9 respostas
blackfalcon

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" + new String(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?

Abraços

9 Respostas

Eric_Yuzo
Acho que assim vai.
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!");
ViniGodoy
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));

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

ViniGodoy

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;
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 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();
        }

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…

Abraços

Criado 16 de dezembro de 2010
Ultima resposta 16 de dez. de 2010
Respostas 9
Participantes 3