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

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

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

}

}
[/code]

Use Thread.sleep:

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

Att.

[quote=Adelar]Use Thread.sleep:

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

Att.[/quote]

Ok pode deixar…

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

Ele vai disparar os eventos mesmo com essa Thread!?

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.

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.

[quote=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.[/quote]

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!?

[quote=alexADS02][quote=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.[/quote]

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!?[/quote]

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.

[quote=Adelar][quote=alexADS02][quote=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.[/quote]

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!?[/quote]

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.[/quote]
Os eventos irão ocorrer DURANTE o prazo de 12 minutos, i. e., de 1 a 12…

[quote=alexADS02][quote=Adelar][quote=alexADS02][quote=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.[/quote]

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!?[/quote]

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.[/quote]
Os eventos irão ocorrer DURANTE o prazo de 12 minutos, i. e., de 1 a 12…[/quote]

Ahhh… acho que estou dormindo pouco heheh :smiley:

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:

[code]
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!");
}

}[/code]

Att.

[quote=Adelar][quote=alexADS02][quote=Adelar][quote=alexADS02][quote=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.[/quote]

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!?[/quote]

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.[/quote]
Os eventos irão ocorrer DURANTE o prazo de 12 minutos, i. e., de 1 a 12…[/quote]

Ahhh… acho que estou dormindo pouco heheh :smiley:

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:

[code]
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!");
}

}[/code]

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

Explicando o código:

[code]
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!");
}

}[/code]

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? :smiley:

Att.

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

    }

}

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.

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

[quote=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.[/quote]
Você conseguiu encontrar alguma coisa?!

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.

[quote=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.[/quote]
Pode deixar que vou olhar agoraa…

Grato

Consegui!!!

VALEU… Muito obrigado Adelar…
Abraço