Desligando o pc com java

9 respostas
R

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

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"); 
}

}
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()); 
}

} 
}

Alguem sabe como fazer para esse programa ficar "leve"?

9 Respostas

E

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

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

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

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

R

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

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.

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) {}
        }
}
Só isso!
R
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.

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) {}
        }
}
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...

o codigo ficou assim:
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");		   
	}
	
}
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);
             }  
    	 			  }  
 	
    }  
}
Criado 22 de novembro de 2012
Ultima resposta 23 de nov. de 2012
Respostas 9
Participantes 3