Problema urgente com cancelamento de programa [RESOLVIDO]

E ai pessoal, tudo mundo tranquilo!?

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.

public void desligarPc(String data, String horario) { while (!hr.getText().equals(data + " - " + horario)){ try { Thread.sleep(1000); this.hr.revalidate(); } catch (InterruptedException e) { e.printStackTrace(); } } try { Runtime.getRuntime().exec("rundll32.exe user.exe,ExitWindows"); Runtime.getRuntime().exec("shutdown -s -t 10"); } catch (IOException e) { e.printStackTrace(); } }

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.

Desde já agradeço!

Bom dia Jovem!!
Nesse caso acredito que terá que usar Thread para esse while que verifica o agendamento.!!

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

Posso estar falando besteira, mas acho que ambos devem estar em threads separadas

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

Oi rafegal,

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.

É isso…

flws

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

Duas dicas:

[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]

Dá uma estudada neste código e veja se é realmente isto que vc precisa.

[code]public class Application {

public static void main(String... args) {
	
	Console console = new Console();
	Engine engine = new Engine();
	
	engine.start();
	
	engine.setConsole(console);
	console.setEngine(engine);
}

}
[/code]

public class Engine extends Thread {
	private boolean started = false;
	private Console console = null;

	public void run() {
		while (true) {
			
			if (this.started) {
				
				try {
					if (this.console != null && this.started) {
						this.console.addMessage("Preparando para executar...\n");
					}
					
					Thread.sleep(1000);
					
					if (this.console != null && this.started) {
						this.console.addMessage("OPERAÇÃO EXECUTADA!\n");
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

	public void setConsole(Console console) {
		this.console = console;
	}

	public void startWorking() {
		this.started = true;
	}
	
	public void stopWorking() {
		this.console.addMessage("------------------------\n");
		this.console.addMessage("P A R A D O!\n");
		this.console.addMessage("------------------------\n");
		this.started = false;
	}
}

[code]public class Console extends JFrame {
private JTextArea txtArea = new JTextArea();
private JButton btnStart = new JButton(“Start”);
private JButton btnStop = new JButton(“Stop”);

private Engine engine = null;

public Console() {
	this.initialize();
}

private void initialize() {
	super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	super.setTitle("GUJ");
	super.getContentPane().add(new JScrollPane(this.txtArea), BorderLayout.CENTER);
	
	JPanel pnlOptions = new JPanel(new FlowLayout());
	pnlOptions.add(this.btnStart);
	pnlOptions.add(this.btnStop);
	
	this.btnStart.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent arg0) {
			engine.startWorking();
		}
	});
	
	this.btnStop.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent arg0) {
			engine.stopWorking();
		}
	});
	
	super.getContentPane().add(pnlOptions, BorderLayout.SOUTH);
	super.setSize(400, 500);
	super.setLocationRelativeTo(null);
	super.setVisible(true);
}

public void addMessage(String message) {
	this.txtArea.append(message);
}

public void setEngine(Engine engine) {
	this.engine = engine;
}

}
[/code]

P.S Esta codificação foi criada e testada apenas para auxiliar em nossa busca pela solução.

flws

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!