Desligando o pc com java

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…

[code]package Desliga;

import java.io.IOException;
import java.util.GregorianCalendar;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import com.sun.corba.se.impl.presentation.rmi.IDLTypeExce ption;

public class metododesliga{

String command;

public void desliga() throws IOException{

Runtime.getRuntime().exec(“cmd /cshutdown -s -f -t 30”);
}

}[/code]

[code]package Desliga;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.Timer;

public class TimerTest extends JPanel {

JLabel label;

DateFormat dateFormat;

public TimerTest() {
this.dateFormat = new SimpleDateFormat(“HH”);
this.initialize();
}

protected void initialize() {
this.setLayout(null);
this.add(this.getButton());
this.go();
}

public JLabel getButton() {
if (this.label == null) {
this.label = new JLabel(getTime());
this.label.setBounds(10, 10, 100, 22);
}
return this.label;
}

public void go() {
ActionListener action = new ActionListener() {
public void actionPerformed(ActionEvent e) {
TimerTest.this.label.setText(getTime());

metododesliga d = new metododesliga();
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 (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}

}
};

Timer t = new Timer(1000, action);
t.start();

}

public String getTime() {
return this.dateFormat.format(Calendar.getInstance().getT ime());
}

public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOS E);
while(true){
frame.setContentPane(new TimerTest());
}

}
}
[/code]

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%.

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!

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:

[quote=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![/quote]

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);?

Eu sou novato nessa area, você por gentileza, poderia me dizer qual seria o melhor lugar pra escrever esse determinado programa?

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.

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.

[quote=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);?[/quote]
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.

[code]public static void main(String [] args) {
while (true) {
// Faz a rotina da verificação da hora

            try {
                 Thread.sleep(60000); // Dorme por um minuto, antes de continuar e verificar de novo.
            } catch (InterruptedException) {}
    }

}[/code]Só isso!

[quote=gomesrod][quote=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);?[/quote]
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.

[code]public static void main(String [] args) {
while (true) {
// Faz a rotina da verificação da hora

            try {
                 Thread.sleep(60000); // Dorme por um minuto, antes de continuar e verificar de novo.
            } catch (InterruptedException) {}
    }

}[/code]Só isso![/quote]

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…

o codigo ficou assim:

[code]package Desliga;

import java.io.IOException;
import java.util.GregorianCalendar;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import com.sun.corba.se.impl.presentation.rmi.IDLTypeException;

public class metododesliga{

String command;

public void desliga() throws IOException{

	Runtime.getRuntime().exec("cmd /cshutdown -s -f -t 60");		   
}

}[/code]

[code]package Desliga;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import javax.swing.Timer;

public class TimerTest{

DateFormat dateFormat;  

public TimerTest() {
    this.dateFormat = new SimpleDateFormat("HH:mm:ss");    
}  

public void go() {
ActionListener action = new ActionListener() {
public void actionPerformed(ActionEvent e) {
metododesliga d = new metododesliga();
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 (IOException e1) {
e1.printStackTrace();
}
}

        }  
    };  
   
   Timer t = new Timer(6000, action);
   t.start();  
}  

public String getTime() {
    return dateFormat.format(Calendar.getInstance().getTime());

}

public static void main(String[] args) { 
	TimerTest t = new TimerTest();
	
	 while (true) {  
		 t.getTime();
         try {  
              Thread.sleep(60000); 
         } catch (InterruptedException e) {
        	 System.out.println(e);
         }  
	 			  }  

}  

}
[/code]