Erro na ao usara javax.swing.timer

Está sendo me apresentado um erro dizendo que o meu timer “t” não é o owner.

segue o código

/*

  • Controle.java
  • Created on 8 de Março de 2007, 20:30
  • To change this template, choose Tools | Template Manager
  • and open the template in the editor.
    */

package servidor;

import java.awt.event.ActionListener;
import javax.swing.JOptionPane;
import javax.swing.Timer;
import parport.ParallelPort;

/**
*

  • @author Cracatio2
    */
    public class Controle implements Runnable {
    Thread girar = new Thread();
    static ParallelPort lpt1 = new ParallelPort(0x378);
    static int contPassos;
    static int passos;
    static Timer t;
    static boolean step;
    static boolean controle = true;

    /**

    • Creates a new instance of Controle
      */
      public Controle() {
      }

    public static void motorUm(int dir, int numPassos)
    throws InterruptedException {
    controle = false;
    passos = numPassos;
    if (dir == 0){
    int contfr = 0;
    lpt1.write(0);
    contPassos = 0;
    step = true;
    controle = true;
    while (controle){
    ActionListener action = new ActionListener() {
    int cont = 1;
    public void actionPerformed(@SuppressWarnings(“unused”) java.awt.event.ActionEvent e) {
    if(step){
    lpt1.write(0);
    step = false;
    }else{
    lpt1.write(1);
    step = true;
    cont ++;
    }
    if (passos < cont){
    t.stop();
    controle = true;
    }
    }
    };
    t = new Timer(300, action);
    t.restart();
    contPassos++;
    t.wait();
    contfr++;
    System.out.println("passo nº: " + contfr);
    }
    }else if(dir == 1){
    int contfr = 0;
    lpt1.write(0);
    contPassos = 0;
    step = true;
    controle = true;
    while (controle){
    ActionListener action = new ActionListener() {
    int cont = 1;
    public void actionPerformed(@SuppressWarnings(“unused”) java.awt.event.ActionEvent e) {
    if(step){
    lpt1.write(2);
    step = false;
    }else{
    lpt1.write(3);
    step = true;
    cont ++;
    }
    if (passos < cont){
    t.stop();
    controle = false;
    }
    }
    };
    t = new Timer(300, action);
    t.restart();
    contPassos++;
    t.wait(); [color=red]//aqui é que está ocorrendo o erro [/color]contfr++;
    System.out.println("passo nº: " + contfr);
    }

     }else{
         JOptionPane.showMessageDialog(null,"Erro ao enviar direção do " +
                 "motor um", "Erro", JOptionPane.ERROR_MESSAGE);
         
     }
    

    }

Grato pela atenção.

Edita o seu post e põe o código entre as tags code, como descrito neste tópico. Seria bom também você colocar o texto da exceção.

Basicamente o problema é o seguinte.

O comando wait() deve ser usado dentro um bloco sincronizado:

synchronized (t) { t.wait(); }
Ele vai fazer a thread atual esperar até que um notify seja dado a mesma variável.

synchronized(t) { t.notify(); }

Não sei se era isso que você pretendia colocando esse wait aí, mas creio que não. Seria legal se você descrevesse em linhas gerais a aplicação para podemos te ajudar melhor…

Estou querendo controlar dispositivos na porta paralela e neste caso pereciso que ele escreva alternadamente em un determinado intervalo de tempo os valor binario na porta paralela.

se eu não colocar o wait() a ele executa os loops todos de uma vez e eu não quero isso quero que ele fique executando os loops quantidade de vezes que eu quero e com este espaço de tempo determinado podemos imaginar uma lâmpada piscando intermitentemente.

segue o código da classe toda

e depois o erro

/*
 * Controle.java
 *
 * Created on 8 de Março de 2007, 20:30
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package servidor;

import java.awt.event.ActionListener;
import javax.swing.JOptionPane;
import javax.swing.Timer;
import parport.ParallelPort;

/**
 *
 * @author Cracatio2
 */
public class Controle implements Runnable {
    Thread girar = new Thread();
    static ParallelPort lpt1 = new ParallelPort(0x378);
    static int contPassos;
    static int passos;
    static Timer t;
    static boolean step;
    static boolean controle = true;
    
    /**
     * Creates a new instance of Controle
     */
    public Controle() {
    }
    
    
    public static void motorUm(int dir, int numPassos)
    throws InterruptedException {
        controle = false;
        passos = numPassos;
        if (dir == 0){
            int contfr = 0;
            lpt1.write(0);
            contPassos = 0;
            step = true;
            controle = true;
            while (controle){
                ActionListener action = new ActionListener() {
                    int cont = 1;
                    public void actionPerformed(@SuppressWarnings("unused") java.awt.event.ActionEvent e) {
                        if(step){
                            lpt1.write(0);
                            step = false;
                        }else{
                            lpt1.write(1);
                            step = true;
                            cont ++;
                        }
                        if (passos < cont){
                            t.stop();
                            controle = true;
                        }
                    }
                };
                t = new Timer(300, action);
                t.restart();
                contPassos++;
                t.wait();
                contfr++;
                System.out.println("passo nº: " + contfr);
            }
        }else if(dir == 1){
            int contfr = 0;
            lpt1.write(0);
            contPassos = 0;
            step = true;
            controle = true;
            while (controle){
                ActionListener action = new ActionListener() {
                    int cont = 1;
                    public void actionPerformed(@SuppressWarnings("unused") java.awt.event.ActionEvent e) {
                        if(step){
                            lpt1.write(2);
                            step = false;
                        }else{
                            lpt1.write(3);
                            step = true;
                            cont ++;
                        }
                        if (passos < cont){
                            t.stop();
                            controle = false;
                        }
                    }
                };
                t = new Timer(300, action);
                t.restart();
                contPassos++;
                t.wait();
                contfr++;
                System.out.println("passo nº: " + contfr);
            }
            
        }else{
            JOptionPane.showMessageDialog(null,"Erro ao enviar direção do " +
                    "motor um", "Erro", JOptionPane.ERROR_MESSAGE);
            
        }
    }
    
    public static void motorDois(int dir, int numPassos) {
        controle = false;
        passos = numPassos;
        if (dir == 0){
            lpt1.write(0);
            contPassos = 0;
            step = true;
            while (contPassos < numPassos){
                ActionListener action = new ActionListener() {
                    int cont = 1;
                    public void actionPerformed(@SuppressWarnings("unused") java.awt.event.ActionEvent e) {
                        if(step){
                            lpt1.write(0);
                            step = false;
                        }else{
                            lpt1.write(4);
                            step = true;
                            cont ++;
                        }
                        if (passos < cont){
                            t.stop();
                            controle = true;
                        }
                    }
                };
                t = new Timer(300, action);
                t.restart();
                contPassos++;
                try {
                    t.wait(1000);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
            }
        }else if(dir == 1){
            lpt1.write(0);
            contPassos = 0;
            step = true;
            while (contPassos < numPassos){
                ActionListener action = new ActionListener() {
                    int cont = 1;
                    public void actionPerformed(@SuppressWarnings("unused") java.awt.event.ActionEvent e) {
                        if(step){
                            lpt1.write(8);
                            step = false;
                        }else{
                            lpt1.write(12);
                            step = true;
                            cont ++;
                        }
                        if (passos < cont){
                            t.stop();
                            controle = true;
                        }
                    }
                };
                t = new Timer(300, action);
                t.restart();
                contPassos++;
                try {
                    t.wait(1000);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
            }
            
        }else{
            JOptionPane.showMessageDialog(null,"Erro ao enviar direção do " +
                    "motor um", "Erro", JOptionPane.ERROR_MESSAGE);
            
        }
    }
    
    public static void motorTres(int dir, int numPassos) {
        controle = false;
        passos = numPassos;
        if (dir == 0){
            lpt1.write(0);
            contPassos = 0;
            step = true;
            while (contPassos < numPassos){
                ActionListener action = new ActionListener() {
                    int cont = 1;
                    public void actionPerformed(@SuppressWarnings("unused") java.awt.event.ActionEvent e) {
                        if(step){
                            lpt1.write(0);
                            step = false;
                        }else{
                            lpt1.write(16);
                            step = true;
                            cont ++;
                        }
                        if (passos < cont){
                            t.stop();
                            controle = true;
                        }
                    }
                };
                t = new Timer(300, action);
                t.restart();
                contPassos++;
                try {
                    t.wait(1000);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
            }
        }else if(dir == 1){
            lpt1.write(0);
            contPassos = 0;
            step = true;
            while (contPassos < numPassos){
                ActionListener action = new ActionListener() {
                    int cont = 1;
                    public void actionPerformed(@SuppressWarnings("unused") java.awt.event.ActionEvent e) {
                        if(step){
                            lpt1.write(32);
                            step = false;
                        }else{
                            lpt1.write(48);
                            step = true;
                            cont ++;
                        }
                        if (passos < cont){
                            t.stop();
                            controle = true;
                        }
                    }
                };
                t = new Timer(300, action);
                t.restart();
                contPassos++;
                try {
                    t.wait(1000);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
            }
            
        }else{
            JOptionPane.showMessageDialog(null,"Erro ao enviar direção do " +
                    "motor um", "Erro", JOptionPane.ERROR_MESSAGE);
            
        }
    }
    
    public static void Garra(int dir, int numPassos){
        controle = false;
        passos = numPassos;
        if (dir == 0){
            lpt1.write(0);
            contPassos = 0;
            step = true;
            while (contPassos < numPassos){
                ActionListener action = new ActionListener() {
                    int cont = 1;
                    public void actionPerformed(@SuppressWarnings("unused") java.awt.event.ActionEvent e) {
                        if(step){
                            lpt1.write(0);
                            step = false;
                        }else{
                            lpt1.write(64);
                            step = true;
                            cont ++;
                        }
                        if (passos < cont){
                            t.stop();
                            controle = true;
                        }
                    }
                };
                t = new Timer(300, action);
                t.restart();
                contPassos++;
                try {
                    t.wait(1000);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
            }
        }else if(dir == 1){
            lpt1.write(0);
            contPassos = 0;
            step = true;
            while (contPassos < numPassos){
                ActionListener action = new ActionListener() {
                    int cont = 1;
                    public void actionPerformed(@SuppressWarnings("unused") java.awt.event.ActionEvent e) {
                        if(step){
                            lpt1.write(128);
                            step = false;
                        }else{
                            lpt1.write(192);
                            step = true;
                            cont ++;
                        }
                        if (passos < cont){
                            t.stop();
                            controle = true;
                        }
                    }
                };
                t = new Timer(300, action);
                t.restart();
                contPassos++;
                try {
                    t.wait(1000);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
            }
            
        }else{
            JOptionPane.showMessageDialog(null,"Erro ao enviar direção do " +
                    "motor um", "Erro", JOptionPane.ERROR_MESSAGE);
            
        }
    }
    
    public void run() {
    }
    
    
    
    
}

qui o erro

Exception in thread "main" java.lang.IllegalMonitorStateException: current thread not owner
        at java.lang.Object.wait(Native Method)

Ok…

Antes de começar a mexer com Threads e Timers, sugiro que você monte uma classe Motor, com o código plenamente entendível para apenas um motor. Você pode aceitar como parâmetro dessa classe os valores que serão escritos na porta paralela (que parece ser uma das únicas coisas que muda nos três métodos dos motores) e uma instância a porta em si (que é compartilhada).

Depois disso, veremos como fazer a sincronização…

Dê uma olhada neste, neste e neste exemplos de aplicações sobre como usar threads e timer.

E há também esse programa, que explica o uso correto do wait e notify().