Cronometro

Olá pessoal,

Sou iniciante em Java, e estou tentando implementar um Cronometro, que tenha os botões START, RESETAR, PEGAR TEMPO. Onde quando clico em PEGAR TEMPO, o tempo no momento do clique deverá ser salvo em um arquivo TXT.

Então minhas dúvidas são: Já iniciei a implemetação do cronometro (segue abaixo o código), mais notei a seguinte falha. O cronometro esta atrasando, quando abro outros programas. É como ele não tivesse prioridade na execução e tivesse q dividir memória ou processador com outros processos. Então gostaria de saber se tem alguma maneira de fazer com o cronomentro nao atrase, dele ter prioridade total, sei lá.

E a outra é se complica muito de pegar esse tempo e salvar num TXT. (ainda não cheguei nessa parte da implementação, estou so me adiantando logo).

Obrigado, :wink:
Kleydson Wilbert

import javax.swing.;
//import java.awt.
;
import java.awt.event.*;

public class Cronos extends JPanel implements ActionListener
{
final JLabel label = new JLabel();
final JButton button = new JButton();
Timer tim = new Timer(10,this);
int cent=0,sec= 0,min = 0;

	public void go(){
	tim.start();
	}

	public void nogo(){
	tim.stop();
	}

	public Cronos(){
	label.setText("00'00''00");		
	button.setText("Start");
    button.addActionListener(new ActionListener() {
	public void actionPerformed(ActionEvent e) {
		if (button.getText() == "Start") {
			button.setText("Stop");
			go();
			}
			else {
			button.setText("Start");
			cent = 0;
			sec = 0;
			min = 0;
			nogo();
			}
		}
 	});
	add(label);
	add(button);
}

public static void main(String args[])
{
JFrame f = new JFrame("Cronometer");
f.addWindowListener(new WindowAdapter() {
  public void windowClosing(WindowEvent e) {
	   System.exit(0);
  }
});

// f.setSize(450,100);
f.setResizable(false);
f.setLocationRelativeTo(null); //centers application on screen
f.setContentPane(new Cronos());
f.pack();
f.show();
}

public void actionPerformed(ActionEvent e){		
	String aux1="",aux2="",aux3="";
	cent++;
	if (cent == 100){
		cent = 0;
		sec++;
	}
	if (sec == 60){
		sec = 0;
		min++;
	}
	if (cent < 10) aux3="0";
	else aux3="";
	if (sec < 10) aux2="0";
	else aux2="";
	if (min < 10) aux1="0";
	else aux1="";
	label.setText(aux1 + min + "'" + aux2 + sec + "''" + aux3 + cent);
}

}

O segredo não é supor que Timer consiga lhe retornar um evento a cada 10 milissegundos EXATAMENTE.
Isso ele nunca vai fazer porque o Windows, o Linux etc. não são sistemas operacionais de tempo real, e o Java também não é uma linguagem de tempo real.*

  • Não, não é para você aumentar a prioridade do seu programa. O Windows não vai obedecer, porque ele também tem processos de alta prioridade, e pode temporariamente baixar a prioridade de seu programa para evitar problemas. Isso simplesmente não funciona.
    O correto, no seu caso, é o seguinte:
  • Crie o tal timer com um período qualquer (por exemplo, 20 ms);
  • Quando você iniciar o timer, pegue o instante atual com System.currentTimeMillis() e guarde em uma variável
  • Quando você for atualizar o timer e o que está sendo mostrado na tela, pegue o instante atual com System.currentTimeMillis() e subtraia o valor guardado na variável. Você terá a quantidade de ms transcorridos, e isso você pode converter fazendo algumas contas. Dessa forma o seu cronômetro vai ter a mesma exatidão do relógio do computador*.
  • Como você deve saber, o relógio do computador normalmente é um pouco impreciso, atrasando ou adiantando alguns minutos por dia. Por isso é necessário usar uma fonte de sincronização externa, como um relógio atômico, que pode ser consultado pelo Windows ou Linux através do protocolo SNTP. Um relógio atòmico aqui no Brasil está em ntp.cais.rnp.br e pode ser configurado no Windows ou no Linux .
1 curtida