[RESOLVIDO] Substituir laço de repetição ocioso

17 respostas
A

Olá pessoal

Existe alguma outra maneira de substituir laço de repetição ocioso!?

No método iniciarTeste eu tenho um do{...}while que não faz nada, ele aguarda até uma tarefa se cumprir num prazo de 12 minutos...
Alguém pode me dar algum auxílio!?

Obrigado

package modelo;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.Timer;

/**
 *@author Alex
 */
public class Teste {

    private AnaliseDados analiseDados;
    private Timer cronometro;
    
    public Teste(EsteiraEletrica ee) {

        analiseDados = new AnaliseDados(ee);
        cronometro = new Timer(30000, analiseDados);

    }

    public void iniciarTeste() {

        cronometro.start();

        do {
                //Não faz nada, aguardo os eventos gerados pela
                //classe AnaliseDados, que implementa a interface ActionListener
        } while (analiseDados.valor <= 2);

        cronometro.stop();

        JOptionPane.showMessageDialog(null, "O teste foi concluído com sucesso!");

        analiseDados.gerarArqTexto();

    }

    public int cancelarTeste() {

        Object[] opcaoBotao = {"SIM", "NÃO"};
        int resposta = JOptionPane.showOptionDialog(null, "Você deseja realmente cancelar o teste?", "CANCELAR TESTE", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, opcaoBotao, opcaoBotao[0]);

        if (resposta == JOptionPane.YES_OPTION) {
            cronometro.stop();
            analiseDados.gerarArqTexto();
            return JOptionPane.YES_OPTION;
        }

        return JOptionPane.NO_OPTION;

    }

}

17 Respostas

Adelar

Use Thread.sleep:

Thread.sleep(1000*60*12); // fica parado por 12 minutos

Att.

A

Adelar:
Use Thread.sleep:

Thread.sleep(1000*60*12); // fica parado por 12 minutos

Att.

Ok pode deixar…

Eu coloco essa instrução dentro do laço!?

Ele vai disparar os eventos mesmo com essa Thread!?

Adelar

Umm… se o valor analiseDados.valor fosse atualizado por uma thread seria para colocar dentro do do:

do { Thread.sleep(1000*60*12); }while(analiseDados.valor <= 2);

mas no seu caso não funciona mesmo… se usar todo o programa vai ficar parado :?

Att.

samuel.grigolato

você precisa esperar exatamente 12 minutos ou até que algo ocorra?

se for o segundo caso… usar os métodos .wait() e .notifyAll() em um objeto compartilhado pela thread principal e o action listener talvez seja a melhor opção.

A

samuel.grigolato:
você precisa esperar exatamente 12 minutos ou até que algo ocorra?

se for o segundo caso… usar os métodos .wait() e .notifyAll() em um objeto compartilhado pela thread principal e o action listener talvez seja a melhor opção.

Samuel você pode ser um pouco mais claro… Não entendi, foi mal…rs

Dentro do prazo de 12 minutos ocorrerão eventos disparados a cada 30 segundos…
Os eventos que ocorrer eu tenho que relatá-los nesse intervalo, entendeu!?

Adelar

alexADS02:
samuel.grigolato:
você precisa esperar exatamente 12 minutos ou até que algo ocorra?

se for o segundo caso… usar os métodos .wait() e .notifyAll() em um objeto compartilhado pela thread principal e o action listener talvez seja a melhor opção.

Samuel você pode ser um pouco mais claro… Não entendi, foi mal…rs

Dentro do prazo de 12 minutos ocorrerão eventos disparados a cada 30 segundos…
Os eventos que ocorrer eu tenho que relatá-los nesse intervalo, entendeu!?

Entendi errado então… se os eventos vão iniciar em 12 minutos então você pode usar Thread.sleep mesmo.

Como o samuel disse pode-se usar wait… segue um link com uma discussão sobre: http://www.guj.com.br/posts/list/74098.java.

Att.

A

Adelar:
alexADS02:
samuel.grigolato:
você precisa esperar exatamente 12 minutos ou até que algo ocorra?

se for o segundo caso… usar os métodos .wait() e .notifyAll() em um objeto compartilhado pela thread principal e o action listener talvez seja a melhor opção.

Samuel você pode ser um pouco mais claro… Não entendi, foi mal…rs

Dentro do prazo de 12 minutos ocorrerão eventos disparados a cada 30 segundos…
Os eventos que ocorrer eu tenho que relatá-los nesse intervalo, entendeu!?

Entendi errado então… se os eventos vão iniciar em 12 minutos então você pode usar Thread.sleep mesmo.

Como o samuel disse pode-se usar wait… segue um link com uma discussão sobre: http://www.guj.com.br/posts/list/74098.java.

Att.


Os eventos irão ocorrer DURANTE o prazo de 12 minutos, i. e., de 1 a 12…

Adelar
alexADS02:
Adelar:
alexADS02:
samuel.grigolato:
você precisa esperar exatamente 12 minutos ou até que algo ocorra?

se for o segundo caso.. usar os métodos .wait() e .notifyAll() em um objeto compartilhado pela thread principal e o action listener talvez seja a melhor opção.

Samuel você pode ser um pouco mais claro... Não entendi, foi mal...rs

Dentro do prazo de 12 minutos ocorrerão eventos disparados a cada 30 segundos...
Os eventos que ocorrer eu tenho que relatá-los nesse intervalo, entendeu!?

Entendi errado então.. se os eventos vão iniciar em 12 minutos então você pode usar Thread.sleep mesmo.

Como o samuel disse pode-se usar wait.. segue um link com uma discussão sobre: [url]http://www.guj.com.br/posts/list/74098.java[/url].

Att.


Os eventos irão ocorrer DURANTE o prazo de 12 minutos, i. e., de 1 a 12...

Ahhh... acho que estou dormindo pouco heheh :D

você pode usar o join para parar por tempo indefinido, até que a thread que foi lançada acabe. Segue um código de exemplo:

public class HelloWorldThread extends Thread {

	public void run() {
		System.out.println("Hello World from Thread ");
		System.out.println("Thread t about to exit...");
	}

	public static void main(String args[]) {
		Thread t = new HelloWorldThread();
		t.start();
		System.out.println("Hello World from Main Thread");
		try {
			t.join();
		}
		catch (InterruptedException ie) {
			System.out.println(ie.getMessage());
		}
		System.out.println("Hello World from Main Thread Again!");
	}

}

Att.

A
Adelar:
alexADS02:
Adelar:
alexADS02:
samuel.grigolato:
você precisa esperar exatamente 12 minutos ou até que algo ocorra?

se for o segundo caso.. usar os métodos .wait() e .notifyAll() em um objeto compartilhado pela thread principal e o action listener talvez seja a melhor opção.

Samuel você pode ser um pouco mais claro... Não entendi, foi mal...rs

Dentro do prazo de 12 minutos ocorrerão eventos disparados a cada 30 segundos...
Os eventos que ocorrer eu tenho que relatá-los nesse intervalo, entendeu!?

Entendi errado então.. se os eventos vão iniciar em 12 minutos então você pode usar Thread.sleep mesmo.

Como o samuel disse pode-se usar wait.. segue um link com uma discussão sobre: [url]http://www.guj.com.br/posts/list/74098.java[/url].

Att.


Os eventos irão ocorrer DURANTE o prazo de 12 minutos, i. e., de 1 a 12...

Ahhh... acho que estou dormindo pouco heheh :D

você pode usar o join para parar por tempo indefinido, até que a thread que foi lançada acabe. Segue um código de exemplo:

public class HelloWorldThread extends Thread {

	public void run() {
		System.out.println("Hello World from Thread ");
		System.out.println("Thread t about to exit...");
	}

	public static void main(String args[]) {
		Thread t = new HelloWorldThread();
		t.start();
		System.out.println("Hello World from Main Thread");
		try {
			t.join();
		}
		catch (InterruptedException ie) {
			System.out.println(ie.getMessage());
		}
		System.out.println("Hello World from Main Thread Again!");
	}

}

Att.


Cara... Eu nao entendi o que esse programa faz... Não manjo Threads... isso que é meu problema...=[

Adelar

Explicando o código:

public class HelloWorldThread extends Thread {

	public void run() {
		System.out.println("Hello World from Thread ");
		System.out.println("Thread t about to exit...");
	}

	public static void main(String args[]) {
		Thread t = new HelloWorldThread();
		t.start();
		System.out.println("Hello World from Main Thread");
		try {
			t.join();
		}
		catch (InterruptedException ie) {
			System.out.println(ie.getMessage());
		}
		System.out.println("Hello World from Main Thread Again!");
	}

}
O início da execução é pelo main. Logo após é criada uma variável do tipo Thread que recebe a classe atual*.
Thread t = new HelloWorldThread();
* Para poder ser atribuída para a variável do tipo Thread a classe atual deve extender a classe Thread:
public class HelloWorldThread extends Thread
Daí quando chama o método start é lançada uma thread (uma linha de execução separada da atual) que executa o que está no método run:
t.start()
executa
public void run() {
		System.out.println("Hello World from Thread ");
		System.out.println("Thread t about to exit...");
	}
Só que não sei quanto tempo a thread vai demorar para finalizar. Então faço a linha de execução atual, que não é da thread, ficar esperando até a thread terminar com:
t.join();
Note que o código a seguir é executado somente quando a thread termina:
System.out.println("Hello World from Main Thread Again!");

Entendeu a idéia? :D

Att.

A

Entendi a ideia sim…

Mas como faço para colocar no meu código!?

A classe AnaliseDados implementa a interface ActionListener para passar no construtor do cronometro, que é uma classe de javax.swing.Timer(delay, listener).

Agora surgiu essa dúvida…
:cry:
Como faço agora?

Obrigado pela atenção

/*
 * Classe reponsável por calcular as voltas percorridas
 * e guardar os dados a cada 30 segundos numa variável
 * do tipo String
 */

package modelo;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * @author
 */
public class AnaliseDados implements ActionListener {

    private int contadorTempo;
    private float voltaPercorrida;
    private EsteiraEletrica estEletrica;
    private ArquivoTexto arqTexto;
    private String relacaoDados;
    private boolean acabou;
    public int valor;

    public AnaliseDados(EsteiraEletrica ee) {
        this.contadorTempo = 0;
        this.estEletrica = ee;
        this.relacaoDados = "00;00;00\r\n";
        this.acabou = false;
        this.valor = 0;
    }

    private float calcularVoltaPercorrida() {
        voltaPercorrida = CursorMouse.getVoltas() * estEletrica.getDistancia();
        return voltaPercorrida;
    }

    //Evento disparado a cada 30 segundos para lançar a relação de dados
    @Override
    public void actionPerformed(ActionEvent e) {

        contadorTempo += 30;
        valor++;
        relacaoDados += contadorTempo+";"+calcularVoltaPercorrida()+";00\r\n";

        //indica que o tempo decorrido foi 12 minutos
        if (contadorTempo == 720) {
            acabou = true;
        }

    }

    public boolean acabouTeste() {
        return acabou;
    }  

    public void gerarArqTexto() {

        arqTexto = new ArquivoTexto();
        arqTexto.salvarArquivo(relacaoDados);

    }

}
Adelar

Não consegui pensar em uma solução viável agora… vou pensar em uma daí amanhã lhe retorno… caso já não tenha resolvido ainda :smiley:

Att.

A

Muito obrigado, sou muito agradecido mesmo!

Não tô conseguindo pensar em nada, falta de pesquisa e de pensar não é te garanto…rs…
Até amanhã…abraços

A

Adelar:
Não consegui pensar em uma solução viável agora… vou pensar em uma daí amanhã lhe retorno… caso já não tenha resolvido ainda :smiley:

Att.


Você conseguiu encontrar alguma coisa?!

Adelar

Achei este exemplo http://www.java2s.com/Code/Java/Swing-JFC/SwingTimerDemo.htm
Não tive como vê-lo direito ainda, mas acho que é uma solução para seu problema.

Att.

A

Adelar:
Achei este exemplo http://www.java2s.com/Code/Java/Swing-JFC/SwingTimerDemo.htm
Não tive como vê-lo direito ainda, mas acho que é uma solução para seu problema.

Att.


Pode deixar que vou olhar agoraa…

Grato

A

Consegui!!!

VALEU… Muito obrigado Adelar…
Abraço

Criado 27 de julho de 2010
Ultima resposta 28 de jul. de 2010
Respostas 17
Participantes 3