Pessoal eu fiz esse programa em java para desligar o pc em tal hora e não deixar ficar ligado até tal hora, mas acontece que o programa tem que ficar executando o dia inteiro no pc pra pegar a hora do sisteme, e o problema é que ele utiliza mais de 90% da cpu...
packageDesliga;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.io.IOException;importjava.text.DateFormat;importjava.text.SimpleDateFormat;importjava.util.Calendar;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JOptionPane;importjavax.swing.JPanel;importjavax.swing.Timer;publicclassTimerTestextendsJPanel{JLabellabel;DateFormatdateFormat;publicTimerTest(){this.dateFormat=newSimpleDateFormat("HH");this.initialize();}protectedvoidinitialize(){this.setLayout(null);this.add(this.getButton());this.go();}publicJLabelgetButton(){if(this.label==null){this.label=newJLabel(getTime());this.label.setBounds(10,10,100,22);}returnthis.label;}publicvoidgo(){ActionListeneraction=newActionListener(){publicvoidactionPerformed(ActionEvente){TimerTest.this.label.setText(getTime());metododesligad=newmetododesliga();if(getTime().equals("00")||(getTime().equals("01")||(getTime().equals("02")||(getTime().equals("03")||(getTime().equals("04")||(getTime().equals("05")||(getTime().equals("06")||(getTime().equals("07")||(getTime().equals("08")||(getTime().equals("09")||(getTime().equals("10")))))))))))){try{d.desliga();}catch(IOExceptione1){// TODO Auto-generated catch blocke1.printStackTrace();}}}};Timert=newTimer(1000,action);t.start();}publicStringgetTime(){returnthis.dateFormat.format(Calendar.getInstance().getTime());}publicstaticvoidmain(String[]args){JFrameframe=newJFrame();frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);while(true){frame.setContentPane(newTimerTest());}}}
Alguem sabe como fazer para esse programa ficar "leve"?
Verifique o horário uma vez por minuto, em vez de verificar uma vez por segundo.
Entretanto, deve haver mais alguma coisa errada, porque checar o horário uma vez por segundo deveria ocupar menos de 0,1% de CPU, não 90%.
gomesrod
Essa é a parte maluca:
while(true){
frame.setContentPane(new TimerTest());
}
O programa está instanciando (e adicionando à janela) novos panels infinitamente, o tempo todo, sem deixar o computador respirar.
Os componentes da interface gráfica só precisam ser criados uma vez!
E
entanglement
Programas para desligar o computador em uma determinada hora não devem nem ser escritos em Swing, para não ficarem pesados. Realmente esse “while (true)” é bizarro :roll:
R
rodazzz
gomesrod:
Essa é a parte maluca:
while(true){
frame.setContentPane(new TimerTest());
}
O programa está instanciando (e adicionando à janela) novos panels infinitamente, o tempo todo, sem deixar o computador respirar.
Os componentes da interface gráfica só precisam ser criados uma vez!
Verdade é ai que tah o problema mesmo, eu tirei o while e coloquei pra testar, só que o programa rodou 1 sec. e fechou, ai eu coloquei essa linha:
frame.setVisible(true);
Ai o programa ficou rodando normal, mas como que eu faço para o programa ficar rodando normal sem o frame.setVisible(true);?
R
rodazzz
Eu sou novato nessa area, você por gentileza, poderia me dizer qual seria o melhor lugar pra escrever esse determinado programa?
R
rodazzz
Assim ele roda 1 sec. e fecha…
public static void main(String[] args) {
TimerTest t = new TimerTest();
t.getTime();
}
ai se eu coloco assim:
public static void main(String[] args) {
TimerTest t = new TimerTest();
while(true){
t.getTime();
}
}
ele fica rodando, só que ta consumindo cerca de 25% da cpu.
E
entanglement
Como você está usando Windows, você pode usar o próprio “Task Scheduler” do Windows e cadastrar o comando shutdown para ser executado a um determinado horário. Programas a escrever: 0
(Você provavelmente vai ter apenas de escrever uma batch com o comando adequado - algo como “at …”
Digite “at /?” em uma linha de comando e veja quais são os parâmetros adequados para que ele cadastre o comando “shutdown” para ser executado.
gomesrod
rodazzz:
ai eu coloquei essa linha:
frame.setVisible(true);
Ai o programa ficou rodando normal, mas como que eu faço para o programa ficar rodando normal sem o frame.setVisible(true);?
Você não quer que a janela apareça?
Isso só indica uma coisa: o Swing não é a ferramenta certa para o seu caso, afinal ele é feito para se criar interfaces gráficas, não é verdade?
Outras alternativas são:
- Se o programa for para um propósito sério, de realmente não permitir que alguém use a máquina nesse horário, siga a dica que acabaram de dar e use o at ao invés de fazer um programa. Tem uma vantagem importante, que é o usuário não poder matar o processo.
- Se o que você quer mesmo é fuçar, aprender, então faça seu programa só que de uma maneira que é muito mais fácil: simplesmente um programa main, sem nenhum componente gráfico, que fica rodando em loop.
publicstaticvoidmain(String[]args){
while(true){
//Fazarotinadaverificaçãodahoratry{
Thread.sleep(60000); // Dorme por um minuto, antes de continuar e verificar de novo.}catch(InterruptedException){}
}
}
Só isso!
R
rodazzz
gomesrod:
rodazzz:
ai eu coloquei essa linha:
frame.setVisible(true);
Ai o programa ficou rodando normal, mas como que eu faço para o programa ficar rodando normal sem o frame.setVisible(true);?
Você não quer que a janela apareça?
Isso só indica uma coisa: o Swing não é a ferramenta certa para o seu caso, afinal ele é feito para se criar interfaces gráficas, não é verdade?
Outras alternativas são:
- Se o programa for para um propósito sério, de realmente não permitir que alguém use a máquina nesse horário, siga a dica que acabaram de dar e use o at ao invés de fazer um programa. Tem uma vantagem importante, que é o usuário não poder matar o processo.
- Se o que você quer mesmo é fuçar, aprender, então faça seu programa só que de uma maneira que é muito mais fácil: simplesmente um programa main, sem nenhum componente gráfico, que fica rodando em loop.
publicstaticvoidmain(String[]args){
while(true){
//Fazarotinadaverificaçãodahoratry{
Thread.sleep(60000); // Dorme por um minuto, antes de continuar e verificar de novo.}catch(InterruptedException){}
}
}
Só isso!
Obrigado funcionou o seu codigo ;D, agora ele fica comparando a hora a cada um minuto...
Eu queria fazer o programa pra aprender mesmo, mas eu vou começar a estudar esse outra forma de fazer isso tbm, pq quanto mais formas eu aprender de fazer alguma coisa melhor...