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!?
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;
}
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.
[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.
[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.
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
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!");
}
[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.
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
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…=[
[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!");
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…
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);
}
}