Tempo de uma tarefa com Thread

8 respostas
R

Olá pessoal…

Estou querendo usar thread para saber qto tempo demora desde o tempo em que o usuario clica em cadastrar até o momento em que a mensagem de sucesso aparece na tela.
Alguem poeria me da uma dica de como eu faço isso?
Eu olhei na especiicação da classe mas nao diz nada sobre isso…

Valew!!

8 Respostas

C

Olá RoniMALK,

O método System.currentTimeMillis() retorna a quantidade de milissegundos do momento atual, contados desde “the epoch” (1970-01-01). Pra você marcar o tempo entre dois instantes, em Java, você pode chamar esse método antes e depois do que você quer marcar o tempo e subtrair os valores:

// Clicou em cadastrar long inicio = System.currentTimeMillis(); // Mostrou mensagem de sucesso long fim = System.currentTimeMillis(); long tempoDecorrido = fim - inicio;

A unidade de tempoDecorrido é em milisegundos. Se quiser em outra unidade, é só converter :wink:

Até mais,

R

Ok.. muito mais facil desse jeito mesmo!! valew!

Mas acontece o seguinte.. eu estou estudando Thread, e tentei desenvolver um contador em um programa que le um arquivo.

Mas eu percebi que o Thread nao funciona exatamente como eu esperava..

Ai vai a a classe Relogio:

public class Relogio extends Thread {
    public int segs;
    public int flut0;
    public int flut1;
    public int flut2;
    public int cont;
    
    public Relogio() {
        segs=0;
        flut0=0;
        flut1=0;
        flut2=0;
        cont=0;
    }
    public void run(){
        try{
            Thread t = new Thread();
            t.run();
            while(true){
                t.sleep(1);
                flut2++;
                if(flut2 == 10){
                    flut2=0;
                    flut1++;                    
                }
                if(flut1 == 10){
                    flut1=0;
                    flut0++;                    
                }
                if(flut0 == 10){
                    flut0=0;
                    segs++;                    
                }
        }
        }catch(Exception e){
        }
    }
}

E aqui onde ela é usada:

long fim, inicio;
Relogio rel = new Relogio();
try{
    rel.start();
    inicio = System.currentTimeMillis();
    PrintWriter pw = new PrintWriter(new FileWriter(jtfNomeArq.getText() + ".txt"));
    pw.println(jtaTexto.getText());
    pw.close();
    jLabel4.setText(rel.segs + "," + rel.flut2 + rel.flut1 + rel.flut2);
    fim = System.currentTimeMillis();
    fim = fim - inicio;
    jLabel6.setText(fim);
}catch(Exception e){
    System.out.println("errrrrrrrrrrrrrrooooooo");
}

Pq as vezes a diferença entre a Thread e a currentTimeMilles é tão grande???

É essa a ideia de Thread afinal???
C

Olá RoniMALK,

Eu não entendi direito o que você quis fazer com esse seu relógio… mas mesmo assim, tem algumas coisas erradas aí:

Thread t = new Thread(); t.run();

Aqui você tá criando uma nova Thread e chamando o método run() dela (o que NÃO é a mesma coisa que iniciar a Thread). O que você quer fazer aqui? O método run() não vai fazer nada, porque sua Thread é nova… A lógica desse seu método que eu não entendi, mas deixa pra lá.

long fim, inicio; Relogio rel = new Relogio(); try{ rel.start(); inicio = System.currentTimeMillis();

Se você quer marcar o tempo de execução da Thread do Relogio, você deveria colocar o valor de início ANTES de chamar o método (você começa a marcar o tempo de um cara nadando exatamente antes de ele começar a nadar, né?) e deveria colocar o valor de fim exatamente depois da execução dele. Mas aí tem um problema: uma Thread (por ser uma Thread) executa em outro plano de execução separado, diferente da Thread que gerou ela - no caso, o seu programa. Então, você manda marcar o tempo do método lá, chama o método, e depois pega o tempo depois dele. Mas a Thread não necessariamente terminou, porque ela é executada separadamente. O que eu to querendo dizer é que fora de uma Thread, você não vai conseguir marcar o tempo de execução dela (pelo menos eu não consigo pensar agora).

Eu ainda não entendi o que você quer fazer… se você explicar melhor, eu posso ajudar melhor também. :wink:

E outro detalhe: EVITE esses seus “catch” vazios. Você vai ter muita dor de cabeça com isso mais tarde.

Até mais,

R

Ok… deixe me explicar melhor…

Minha intenção era de fazer uma thread que calculasse o tempo que demora para eu gravar um arquivo de texto…

Coloquei no metodo run() para o sleep ser de 1 milisegundo, para que eu pudesse calcular segundos e mili segundos dessa tarefa (“segs, ms ms ms”), que seriam o flut0 1 e 2. Entendeu?
O system.currentTimeMillis eu so pus para comparar com o resultado do que eu obtive na thread…

O que eu fiz foi que a thread começasse a rodar qdo eu clicasse em gravar, e parasse qdo a gravassão tivesse sido concluida. Qdo ela concluir eu mostro o tempo que a thread rodou:

jLabel4.setText(rel.segs + "," + rel.flut2 + rel.flut1 + rel.flut2);

e em outro label a diferença pelo currentTimeMillis():

inicio = System.currentTimeMillis(); 
...
fim = System.currentTimeMillis(); 
fim = fim - inicio; 
jLabel6.setText(fim);

Bom, a ideia que eu tinha de thread era que ela funcionaria nesse caso para mostrar o tempo que esse processo de gravassão demorou, mas dai eu usaria um simples currentTimeMillis…

Será que voce pode me ajuda a entende thread? Pelo que eu li tomei essas conclusões, mas parecem estar erradas… em que situações eu poderia usar uma thread??

Obrigado pelas dicas!

C

Olá RoniMALK,

Você quer saber o tempo que demora pra fazer uma operação em um arquivo texto? Você não precisa de um Thread pra isso, porque uma Thread é uma coisa independente, e ela não vai conseguir marcar o tempo de outra coisa que não esteja executando com ela.

Pelo que eu entendi, pra você marcar o seu tempo, você poderia fazer assim:

long fim, inicio; try{ inicio = System.currentTimeMillis(); PrintWriter pw = new PrintWriter(new FileWriter(jtfNomeArq.getText() + ".txt")); pw.println(jtaTexto.getText()); pw.close(); fim = System.currentTimeMillis(); jLabel6.setText(fim - inicio); }catch(Exception e){ System.out.println("errrrrrrrrrrrrrrooooooo"); }

Isso resolve? Ou eu ainda não entendi o que você quer?

Até mais,

R

Sim sim Cristian, voce entendeu perfeitamente o que eu queria…

Eu sei que pelo currentTimeMillis eu tenho o tempo… mas achei que fazendo aquilo que eu fiz com a thread seria equivalente…

Mas vendo que não é equivalente, eu nao entendi pra que serve a thread entao… digo, ate entendi, que á para ter processos rodando em paralelo, interessante para jogos… capturar uma tecla que foi pressionada, etc…

Mas achei que o que eu fiz tambem poderia aplicar thread…

Só pra deixar claro, oq eu posso fazer com uma thread entao? Será que vc poderia me ajudar citando alguns exemplos pratico ou ate alguma coisa para eu tentar implementar??

Valew!!

C

Olá RoniMALK,

Você usa Threads quando você quer executar alguma coisa e não quer esperar o término dela para continuar com o resto do programa. Por exemplo:

  1. Você tem uma JProgessBar e quer que o seu programa fique analisando um arquivo e aumentando a barra de progressão. Se no seu código, você colocar a atualização da JProgressBar junto com o código da leitura do seu arquivo (o que é o mais intuitivo de se fazer), a barra não será atualizada em nada enquanto o seu código que lê o arquivo não terminar. Porque mesmo que você esteja atualizando a barra, o programa está “concentrado” em fazer a leitura do arquivo. Uma solução pra isso é você usar uma outra Thread para atualizar a JProgressBar, porque ela trabalha em paralelo com a leitura do arquivo.

  2. Você fez um programa que verifica se ele tem novas atualizações assim que abre (como muitos programas por aí). Se você não usar Thread, e colocar a verificação no início do programa, o usuário não pode usar o programa enquanto a verificação não terminar. E o programa fica sem responder enquanto isso (porque está “concentrado” na verificação da atualização). E o pior é que se a verificação for pela Internet, pode demorar algum tempinho enquanto o programa não dá sinal de vida. Uma solução é usar uma Thread para verifica atualização, porque aí ela fica verificando se o programa tem atualização, enquanto a Thread principal fica lá respondendo à entrada do usuário.

E tem mais exemplos, que eu não me lembro agora :stuck_out_tongue:

Até mais,

  • Ontem de tarde quando eu ia responder esse e-mail, caiu a Internet por aqui :cry: Um cabo de transmissão lá na Bahia teve problemas. Aí por isso esse “gap” pra eu responder :stuck_out_tongue:
R

Poxa… muito obrigado pela paciencia!

Agora sim eu consegui identificar a utilidade de Threads…

Vou dar mais uma estudada aqui e tentar implementar algum programa em cima, pra ver na pratica dai…

Brigadão!!

Abraços!

Criado 13 de junho de 2006
Ultima resposta 20 de jun. de 2006
Respostas 8
Participantes 2