Pausa dentro do TIMER

10 respostas
maecar

Pessoal, preciso que dentro da função run() do meu Timer haja uma pausa de tempo em segundos, que um método que já criei informará ao programa quando precisar. Porém não sei que comando utilizar para fazer essa pausa.

Tentei o Thread.sleep(tempo); mas o programa trava todinho por aquele tempo e não é isso que eu quero.

O programa simula uma fila de impressão de 4 micros, o sistema joga os documentos na fila e automaticamente o timer comanda a remoção dos documentos. Porém, os documentos devem sair com tempo proporcional ao seu tamanho. E o tamanho é gerado aleatoriamente no ato da inserção do documento na fila.

Tudo está pronto, mas não consigo fazer esse tempo proporcional.

O Timer já tem um tempo de delay especificado por mim (5000ms), mas tentei inserir no lugar do delay a chamada do método que retorna o tamanho do arquivo (que pode ser usado como tempo em ms). Entretanto, o Timer pega o tempo de delay do primeiro elemento da fila e usa esse mesmo delay para todos os demais. Quando na verdade deveria ter um delay diferente para cada elemento, de acordo com o tamanho do arquivo na fila, que é uma variável do tipo int.

Alguém poderia me ajudar, por favor?

10 Respostas

ivo_costa

Se tu postar o código fica mais fácil.

maecar
//TIMER DA REMOÇÃO DE DOCUMENTOS
Timer timer;
timer = new Timer();
timer.schedule(spool,Long.parseLong(spool.getTamanho()),1000);

E o método run() que contém o que deve ser feito:

//MÉTODO PARA O TIMER PARA REMOÇÃO DE ELEMENTOS AUTOMÁTICA DA FILA DE IMPRESSÃO
public void run() {
     Remover_Elemento();
}
ViniGodoy

É o Thread.sleep mesmo. Mas isso deve ser feito na thread do timer. Você está usando uma thread separada para o timer, não está?

Ou está usando o timer do swing? Ou do java.util?

maecar

Como crio essa Thread?
Estou usando o Timer do java.util…
O outro do swing seria melhor?

ivo_costa

Eu acho que desse jeito você tá dando um sleep na "impressora e nçao nos documentos.

Tenta fazer um construtor na Thread Timer pra ela receber o tempo e ela ficar encarregada de parar durante aquele tempo…
Ou seja coloque o sleep dentro da Classe Timer.

maecar

Eu fiz isso, mas o sleep quer onde ele esteja faz o programa todinho travar durante aqueles segundos. O usuário não pode apertar nenhum botão, não pode fazer mais nada, o programa “dorme” por alguns segundos.
Não existe algo que não trave desse jeito?

ivo_costa

Tenta o

this.wait(tempo em milisegundos)//dentro da thread

ou

timer.wait(tempo em milisegundos)

ao invés do sleep

maecar

Como deveria ficar isso? Assim?

public void run() {
        try {
            this.wait(5000);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
        Remover_Elemento();
    }

Se for isso mesmo está dando um erro e não está funcionando o timer:

[color=red]Exception in thread Timer-0 java.lang.IllegalMonitorStateException

at java.lang.Object.wait(Native Method)

at filadeimpressao.Fila.run(Fila.java:119)

at java.util.TimerThread.mainLoop(Timer.java:512)

at java.util.TimerThread.run(Timer.java:462)[/color]
ivo_costa

com o sleep deveria funcionar provávelmente existe erros na lógica do teu programa, posta ele completo (se não for muito grande) ou debuga com uma ide tipo eclipse ou netbeans.

Ai vai um exemplo de um run com sllep que eu fiz a tempo atrás:

public void run(){
		Pessoa aux;
		
		while (true){
			try { Parque.SemaforoDoBrinquedo[tipoDeBrinquedo].acquire();} catch(Exception e){}
			if (Parque.filasDosBrinquedos[tipoDeBrinquedo].size() >= capacidadeDePessoas){	        
				
				for (int i=0; i<capacidadeDePessoas; i++){
					pessoasNoMeuBrinquedo.add(Parque.filasDosBrinquedos[tipoDeBrinquedo].get(0));
					Parque.filasDosBrinquedos[tipoDeBrinquedo].remove(0);
				}
				Parque.arrumaAFilaNoMenu(Parque.filasDosBrinquedos[tipoDeBrinquedo], 2, tipoDeBrinquedo);
				
				Parque.SemaforoDoBrinquedo[tipoDeBrinquedo].release();
				
				Parque.arrumaAFilaNoMenu(pessoasNoMeuBrinquedo, 3, tipoDeBrinquedo);
				
				switch (tipoDeBrinquedo){
					case 0: InterfaceComUsuario.jLabel13.setText("BRINQUEDO CHEIO"); break;
					case 1: InterfaceComUsuario.jLabel28.setText("BRINQUEDO CHEIO"); break;
					case 2: InterfaceComUsuario.jLabel27.setText("BRINQUEDO CHEIO"); break;
					case 3: InterfaceComUsuario.jLabel26.setText("BRINQUEDO CHEIO"); break;
				}
				
				try { sleep(5000);} catch(Exception e){}
				pessoasNoMeuBrinquedo.clear();
				Parque.arrumaAFilaNoMenu(pessoasNoMeuBrinquedo, 3, tipoDeBrinquedo);
				
				switch (tipoDeBrinquedo){
				case 0: InterfaceComUsuario.jLabel13.setText("PARADO"); break;
				case 1: InterfaceComUsuario.jLabel28.setText("PARADO"); break;
				case 2: InterfaceComUsuario.jLabel27.setText("PARADO"); break;
				case 3: InterfaceComUsuario.jLabel26.setText("PARADO"); break;
				}
				
				tempoDeEsperaDaFila = System.currentTimeMillis();
	        }
			else if((System.currentTimeMillis() - tempoDeEsperaDaFila) >= 10000  && !Parque.filasDosBrinquedos[tipoDeBrinquedo].isEmpty()){
				
				pessoasNoMeuBrinquedo.addAll(Parque.filasDosBrinquedos[tipoDeBrinquedo]);
				Parque.filasDosBrinquedos[tipoDeBrinquedo].clear();
				Parque.arrumaAFilaNoMenu(Parque.filasDosBrinquedos[tipoDeBrinquedo], 2, tipoDeBrinquedo);
				
				Parque.SemaforoDoBrinquedo[tipoDeBrinquedo].release();
				
				Parque.arrumaAFilaNoMenu(pessoasNoMeuBrinquedo, 3, tipoDeBrinquedo);				
				
				switch (tipoDeBrinquedo){
				case 0: InterfaceComUsuario.jLabel13.setText("FUNCIONANDO POR TEMPO"); break;
				case 1: InterfaceComUsuario.jLabel28.setText("FUNCIONANDO POR TEMPO"); break;
				case 2: InterfaceComUsuario.jLabel27.setText("FUNCIONANDO POR TEMPO"); break;
				case 3: InterfaceComUsuario.jLabel26.setText("FUNCIONANDO POR TEMPO"); break;
				}
				
				try { sleep(5000);} catch(Exception e){}
				pessoasNoMeuBrinquedo.clear();
				Parque.arrumaAFilaNoMenu(pessoasNoMeuBrinquedo, 3, tipoDeBrinquedo);
				
				switch (tipoDeBrinquedo){
				case 0: InterfaceComUsuario.jLabel13.setText("PARADO"); break;
				case 1: InterfaceComUsuario.jLabel28.setText("PARADO"); break;
				case 2: InterfaceComUsuario.jLabel27.setText("PARADO"); break;
				case 3: InterfaceComUsuario.jLabel26.setText("PARADO"); break;
				}
				
				tempoDeEsperaDaFila = System.currentTimeMillis();				
			}
			else Parque.SemaforoDoBrinquedo[tipoDeBrinquedo].release();
			
			try { sleep(Parque.SleepDosBrinquedos[tipoDeBrinquedo]);} catch(Exception e){}
		}
	}
ViniGodoy

Tente usando outra thread. Dá uma olhada nos últimos 3 posts do tópico:
http://www.guj.com.br/posts/list/52964.java

Criado 20 de novembro de 2007
Ultima resposta 20 de nov. de 2007
Respostas 10
Participantes 3