Então, estou com um problema no meu código. Estou montando um programa que desligue o computador no horário agendado, ele está funcionando certinho, porém não consigo cancelar o agendamento, depois que fiz um agendamento ou eu espero ele desligar ou mato o processo no gerenciador de processos.
Eu preciso de um maneira que quando eu clique no botao Cancelar ele pare de rodar, mas o problema é que o agendamento ele está num laço, e o botao cancelar fica inativo para clique, não sei o que eu faço, estou postando o trecho que realiza o desligamento do computador após o agendamento.
O while deixa meu programa parado, fazendo com que eu não consiga usar outro botão, não sei se tem alguem meio para eu poder cancelar o agendamento que eu fiz.
Eu já estou udando Thread, só não sei se estou usando corretamento, comecei a aprender Thread sozinho e faz apenas alguns dias que estou lendo, não sei se a maneira que estou usando esta correta, por isso postei o codigo, porque como citei, o codigo esta funcionando, mas ele não sai do While, fazendo com que eu não consiga cancelar o agendamento.
Jovem, vc terá que implentar a Runnable em sua classe. Essa thread postada em seu código é “única” para o programa…no caso terá que criar outra para rodar apenas a tarefa…O exemplo abaixo está incompleto mas server para dar uma base!!
import java.io.IOException;
public class Teste implements Runnable{
private String data;
private String horario;
public Teste() {
}
public static void main(String args[]){
Teste teste = new Teste();
teste.start();
}
public void run(){
while(true){ //aqui vc pode validar o System.ini para captar alguma tecla pressionada!!
try{
if (!hr.getText().equals(data + " - " + horario)){
Thread.sleep(1000);
this.hr.revalidate();
}else{
try {
Runtime.getRuntime().exec("rundll32.exe user.exe,ExitWindows");
Runtime.getRuntime().exec("shutdown -s -t 10");
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
}
Eu já tenho minha Runnable rodando mostrando o horario atual para o usuario, não sei como colocar a parte de agendamento dentro disso.
} public void run()
{
try {
while (true) {
Date d = new Date();
data = new StringBuffer();
if(mostrarData) {
SimpleDateFormat sdfData = new SimpleDateFormat("dd/MM/yyyy");
data.append(sdfData.format(d));
data.append(" - "); }
sdf = new SimpleDateFormat("HH:mm");
this.hr.setText(data.toString() + sdf.format(d));
Thread.sleep(1000);
this.hr.revalidate();
}
} catch (InterruptedException ex) {
//MenuItem.erroSistema("Problema na atualização da data/hora",this);
}
}
Para me intrometer neste assunto vou lhe dar a seguinte dica:
Inicialmente, como já foi dito antes, seria bom vc isolar essa parte de código (a que desliga o treco) em uma thread.
Para impedir ou dar continuidade a ação do código sob o domínio da thread você definir uma variável neste objeto, poderia se um boolean. O objeto (thread) tem que permitir a atualização do valor desta variável através de “set” ou um outro nome (adequado) que vc achar melhor.
No código onde desliga a máquina vc terá que colocar uma codição verificando o valor da variável definida se for verdadeira, blz, desliga a máquina senão ignora o código.
Não sei se não estou entendend direito… Mas o que eu entendi do que vc falou já esta funcionando, ele esta desligando, o meu problema é que depois de agendando eu não consigo cancelar o agendamento.
Não sei se estou fazendo confusão com o comentários de vocês, mas como disse antes sou iniciante em Thread, e é foda aprende isso aí sozinho, mas estou me esforçando pra aprende e conto com a ajuda de vocês caso eu esteja fazendo confusão realment :S
[list]Existe uma classe java.util.Timer com métodos que recebem um comando ou uma série deles e uma data/hora executá-los e também dá para cancelá-los a qualquer hora. Essa classe já roda em thread e não vai bloquear o teu sistema. Também há outras opções de agendamento, leia o Javadoc.[/list]
[list]Considere usar o serviço de agendamento do Windows.[/list]
Então vou da uma olhada nesse codigo que você me passou, mas já consegui resolver o proble, usando a idéia do robinsonbsilva, fiz o seguinte:
public void run()
{
try {
while (true) {
Date d = new Date();
data = new StringBuffer();
if(mostrarData) {
SimpleDateFormat sdfData = new SimpleDateFormat("dd/MM/yyyy");
data.append(sdfData.format(d));
data.append(" - "); }
sdf = new SimpleDateFormat("HH:mm");
this.hr.setText(data.toString() + sdf.format(d));
Thread.sleep(1000);
this.hr.revalidate();
if (!hr.getText().equals(Data + " - " + Hora)){
Thread.sleep(1000);
this.hr.revalidate();
}else{
try {
Runtime.getRuntime().exec("rundll32.exe user.exe,ExitWindows");
Runtime.getRuntime().exec("shutdown -s -t 10");
} catch (IOException e) {
e.printStackTrace();
}
}
}
} catch (InterruptedException ex) {
//MenuItem.erroSistema("Problema na atualização da data/hora",this);
}
}
Ai eu so chamo a Thread quando eu agendar não mais quando eu iniciar o programa, assim eu consigo cancelar.
Obrigado a todos pela ajuda, continuo um pouco perdido com Thread mas vou estudar mais e é isso ai!
RESOLVIDO!