Olá pessoal
Bom, antes de mais nd, quero dizer que ja procurei aqui no guj, em outros foruns de discussao e no google, inclusive achei varios exemplos, mas nenhum resolveu a ultima parte do meu cronometro, que é os milissegundos, e que eu quero fazer um cronometro que mostre os minutos, segundos e os milissegundos, ou seja, de 0 a 999 antes de incrementar mais um nos segundos, como o cronometro de um relogio de pulso mesmo…
Bom abaixo segue um link de um post daqui do guj que leva a outros 3 posts, sao varios exemplos, mas nenhum resolveu a parte dos milissegundos.
http://www.guj.com.br/posts/list/71533.java
Eu fiz um codigo que funciona ±, pra isso tomei por base o exemplo desse link, o segundo post do tópico, só que fiz uma alteração pra que o cronometro seja atualizado constantemente na tela, o problema desse exemplo é que ele nao zera a variável dos milissegundos ao chegar em 1000.
http://www.guj.com.br/posts/list/71349.java
A alteração que fiz é em relação a zerar a variavel dos milissegundos, só que por conta do processamento ser muito rapido eu acho q nao tah funcionando direito, abaixo segue o codigo que fiz
[code]public class Cronometro implements Runnable {
private long inicio;
private long minuto;
private long segundo;
private long milisegundo;
public Cronometro() {
inicio = 0;
milisegundo = 0;
new Thread(this).start();
}
@Override
public void run() {
inicio = System.currentTimeMillis();
while (!pararCronometro) {
try {
if (milissegundos() > 990 && milissegundos() < 1020) {
inicio = System.currentTimeMillis();
segundo = (segundo < 60) ? segundo + 1 : 0;
minuto = (segundo == 0) ? minuto + 1 : minuto;
}
jtfCronometro.setText(minuto + ":" + segundo + ":" + milissegundos());
Thread.sleep(1);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
//Retorna o tempo em milissegundos
public long milissegundos() {
synchronized (this) {
return milisegundo = System.currentTimeMillis() - inicio;
}
}
//Retorna o tempo em segundos
public long segundos() {
synchronized (this) {
return segundo = milissegundos() / 1000;
}
}
//Retorna o tempo em minutos
public long minuto() {
synchronized (this) {
return minuto = milissegundos() / 100000;
}
}
}[/code]
pra iniciar essa thread eu simplesmente faço
Thread t = new Thread(new Cronometro());
existe uma variavel de controle para parar a thread (pararCronometro).
eu digo que esse codigo funciona ±, pq comparando ele com o relogio do windows, tem horas em q ele se adianta (coisa de menos de um segundo), mais adianta, hehehe, e tem horas q ele se atrasa em relação ao relogio do windows, eu tive q colocar aquele if > 990 e < 1020, pra verificar se os milissegundos estao perto de 1000, pq se colocar = a 1000, ele nao percebe e passa direto (por isso q eu digo que ele nao funciona direito pq acho q o processamento é muito rapido), sem igualar novamente a variavel inicio aos milissegundos do sistema, fazendo o efeito de zerar os milissegundos. só que por conta disso ele se adianta ou atrasa um pouquinho, e mesmo assim, algumas vezes ele passa pelo if, fazendo com que a contagem dos milissegundos mostrada na tela passe de 999.
Obs: Eu deixei meu cronometro funcionando durante 5 minutos e 43 segundos, e ele estava 3 segundos atrasado em relação ao relogio do windows.
Alguem sabe fazer um cronometro com milissegundos que realmente funcione ???
Obrigado t+