Bien tengo una duda, quería hacer un programa en el cual a la 1 de la mañana me apagase el ordenador por temas de ahorrar luz.
Bien esto ya esta echo, lo e echo con un bucle que me comprueba constantemente que hora es, y en el momento que la hora se pone a 1, me sale del bucle y me inicializa el apagado, simple.
El problema que tengo es el siguiente, en el momento que me empieza el bucle me consume demasiados recursos, y me gustaría saber si hay algún método para poder comprobar la hora constantemente sin necesidad de gastar tanta máquina.
Un saludo y gracias de antemano.
Claro que lo hay:
Tread.sleep(3600000);
Cada hora comprobará que hora es y ahorrará recursos
Cita de: Juan. en 28 Agosto 2013, 16:15 PM
Claro que lo hay:
Tread.sleep(3600000);
Cada hora comprobará que hora es y ahorrará recursos
Pero por ejemplo y si el programa inicia a las 11:30 a las 12:30 volverá a comprobar y de ahí hasta la 1:30 xD.
Me pareció interesante y me dediqué a tirar código un rato xD
/*
* Autor: 1mpuls0
*/
package basic;
import java.util.Calendar;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.text.DateFormat;
import java.text.ParseException;
import java.lang.Thread;
public class CheckTime {
public static void main(String args[]) {
Date currentDate = getCurrentDate();
Date lastDate = stringToDate("2013-08-28 12:10:20");
long diff = differenceTime(currentDate, lastDate);
System.out.println(currentDate);
System.out.println(lastDate);
System.out.println(diff);
new ThreadShutdown(diff).run();
}
public static long differenceTime(Date currentDate, Date lastDate) {
long msDifference = 0;
long msCurrentDate = currentDate.getTime();
long msLastDate = lastDate.getTime();
if(msLastDate>msCurrentDate)
msDifference = Math.abs(msCurrentDate - msLastDate);
return msDifference;
}
public static Date getCurrentDate() {
String currentDate;
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
currentDate = dateFormat.format(date);
try {
dateFormat.parse(currentDate);
} catch (ParseException ex) {
ex.printStackTrace();
}
return date;
}
public static Date stringToDate(String strDate) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
try {
date = format.parse(strDate);
} catch (ParseException ex) {
date = getCurrentDate();
}
return date;
}
}
class ThreadShutdown implements Runnable {
private final Thread thread;
private long time = 0;
public ThreadShutdown(long time) {
this.time = time;
thread = new Thread(this);
thread.start();
}
private void process() {
System.out.println("APAGATE!!!");
}
public void run() {
try {
thread.sleep(time);
process();
}
catch (InterruptedException ie) {
System.out.println("Error: "+ie);
}
}
}
Solo hacen falta un par de validaciones pero ya depende de que deseas que haga, por ejemplo cuando llegue a escribir la fecha de apagado menor a la fecha y hora actual.
Espero que te funcione.
Saludos.
Bueno en media hora que e podido sacar me a salido esto, esto es lo que yo queria, esta un poco guarro, pero bueno ya lo pulire cuando tenga tiempo.
Muchas gracias a los dos, que bonito es tu codigo Darhius xD.
package main;
import graphicinterface.Interface;
import javax.swing.SwingUtilities;
import protocols.Timer;
public class Main {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
public void run(){
new Timer();
new Interface();
}
});
}
}
package protocols;
import java.util.Calendar;
public class Timer {
public Timer(){
protocolOfHour();
}
public boolean protocolOfHour(){
Calendar calendario = Calendar.getInstance();
int hora;
do{
try {
Thread.sleep(100000);
} catch (InterruptedException e) {
e.printStackTrace();
}
hora =calendario.get(Calendar.HOUR_OF_DAY);
}while(hora!=1);
return true;
}
}
package protocols;
import java.io.IOException;
public class Protocol {
public Protocol(){
exec("REG ADD HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run /v ShutdownProgramado /t REG_SZ /f /d 'C:\\Users\\Zoik\\Documents\\shutdown.jar'");
exec("shutdown -p -f");
}
private void exec(String cmd) {
try {
Runtime.getRuntime().exec(cmd);
}
catch (IOException e) {
System.out.println("El apagado a fallado");
}
}
}
package graphicinterface;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import protocols.Protocol;
public class Interface extends JFrame{
private static final long serialVersionUID = 1L;
JLabel text = new JLabel("");
JPanel panel = new JPanel();
int segundos = 300;
Timer timer;
public Interface(){
setSize(300,35);
setLocationRelativeTo(null);
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
setResizable(false);
setUndecorated(true);
setAlwaysOnTop(true);
setVisible(true);
addLabel();
contador();
}
class RemindTask extends TimerTask {
public void run() {
segundos--;
if(segundos < 0){
text.setText(String.valueOf("El ordenador se apagará en 0 segundos"));
new Protocol();
}else{
text.setText(String.valueOf("El ordenador se apagará en "+segundos+" segundos"));
}
}
}
private void addLabel(){
panel.setBorder(BorderFactory.createLoweredBevelBorder());
add(panel);
panel.add(text);
}
private void contador(){
timer = new Timer();
timer.schedule(new RemindTask(),0, 1*1000);
}
}
Un saludo y gracias de nuevo.
EDITO: ¿Como pongo el código con líneas numeradas como tu Darhius?
Cita de: Zoik en 28 Agosto 2013, 21:46 PM
Muchas gracias a los dos, que bonito es tu codigo Darhius xD.
Gracias. Aunque algunas librerías están de más y olvidé borrarlas, es que hice pruebas con Calendar
Voy a mejorarlo y hacer pruebas entre timer y thread para ver cual resulta mejor en cuanto al consumo de recursos.
Después de eso le pondré una interfaz ;D y postearé el código ya mejorado.
Cita de: Zoik en 28 Agosto 2013, 21:46 PM
EDITO: ¿Como pongo el código con líneas numeradas como tu Darhius?
Cuando respondes un mensaje hay un select que por default dice
GeSHi ahí seleccionas el lenguaje y colocas el código dentro de las etiquetas que saldrán.