Que laço uso pra isso? [resolvido]

6 respostas
R

E ai pessoal tudo bom?

Eu estou criando um programa que desligue o computador na data e horario que o usuario desejar, meu programa já está funcionando corretamente, porém enquanto ele esta rodando ele, come 100% do processamento da máquina, coisa que não acontece com programas desse tipo. Eu preciso saber como fazer o comparativo da data e horario atual com a data e horario agendado pelo usuario sem ter esse problema no desempenho.
O trecho do código que preciso mudar está abaixo:

public void desligarPc(String data, String horario) { //hr é a variavel que esta armazenando a data e horario atual, da seguinta forma (##/##/#### - ##:##) while (!hr.getText().equals(data + " - " + horario)){ Enquando isso for falso(por isso o !) ele continuar rodando try { Runtime.getRuntime().exec("rundll32.exe user.exe,ExitWindows"); Runtime.getRuntime().exec("shutdown -s -t 10"); //aqui eu realizo o desligamento } catch (IOException e) { // TODO Auto-generated catch block //e.printStackTrace(); } } }

Preciso tirar aquele while, sei que não é correto usa-lo, mesmo que funcione, preciso de uma solução que tenha melhor desempenho.

Desde já agradeço!

6 Respostas

leoramos

Cara, dá uma olhadinha nisso aqui um pouco:
http://java.sun.com/j2se/1.5.0/docs/api/java/util/Timer.html
http://java.sun.com/j2se/1.5.0/docs/api/java/util/TimerTask.html

O que me parece (posso estar falando besteira) é que tu tá fazendo teu programa entrar num loop praticamente infinito, ele lê o horário do teu sistema o tempo inteiro… por isso esse consumo de processamento absurdo.
Dá uma olhada nos links acima, e principalmente, dá uma estudada em threads (não do fórum, Threads mesmo).

Qualquer dúvida, berra! Abraço!

wagner_a_lima

Acho que você deve procurar algo sobre threads.

Leonardo_Gloria

Concerteza, dah uma olhada na parte de Threads d java q eu acho q vai resolver seu problema!
8)

[]s!

R

Então, eu sei que não devo usar while, apenas usei para testar e mostrar como quero q funcione.
Já tinham me falado que talvez desse certo usando Threads, porem meu professor disse que não havia necessidade, mas tabém não me ajudou com o problema :S

Mas vou seguir a dica de vocês e procurar sobre Threads.

Muito obrigado pela ajuda

ViniGodoy

Se seu horário não incluir os segundos, dê um sleep para verificar uma vez só a cada minuto (ou a cada 30 segundos, para garantir que o sleep sempre acordará dentro de um minuto):

public void desligarPc(String data, String horario)
	{	
		//hr é a variavel que esta armazenando a data e horario atual, da seguinta forma (##/##/#### - ##:##)	
		while (!hr.getText().equals(data + " - " + horario)){ 
			try {				
				Runtime.getRuntime().exec("rundll32.exe user.exe,ExitWindows");
				Runtime.getRuntime().exec("shutdown -s -t 10");    //aqui eu realizo o desligamento
				Thread.sleep(30000);
			} catch (IOException e) {
				//e.printStackTrace();
			} catch (InterruptedException e) {} 			
		}		
	}

Da forma que seu programa está hoje, ele verifica centenas de vezes por milisegundo se está ou não no horário, para que o computador seja desligado. Com o sleep, ele verificará apenas uma vez a cada minuto.

Outra coisa. Ao invés de fazer a comparação usando string, considere com carinho a possibilidade de usar um Calendar diretamente.

R

Então cara, valeu mesmo pela dica, acho que agora funcionara corretamente.
E quanto a possibilidade de usar um Calendar, eu já tentei usa-lo mas não consegui, e de tanto quebra a cabeça vi o caminho das String mais fácil, testei e funcionou.

Mas agora funcionando, vou testar outra coisa pra melhorar o desempenho concerteza, vou estudar mais sobre Calendar pra não me perde de novo!

Obrigado pela Ajuda!

Criado 26 de agosto de 2009
Ultima resposta 26 de ago. de 2009
Respostas 6
Participantes 5