Programación General > Java

 Calcular Retardos

<< < (2/2)

jpaler:
silver, estube leyendo en un libro de java2 de javier ceballos y si...
...,efectivamente explica de manera igual lo del sleep y wait.

silver, lo q necesito hacer es:
hacer un metodo q envie/reciba datos por el puerto serial y q reciba un parametro
q indique el tiempo maximo q este (el metodo) puede tardar esperando (en
caso de q el dispositivo al q le va a enviar/recibir datos se encuentre ocupado).

Haciendo una analogia con otros metodos parecidos, te puedo decir q es algo asi como System.in.read().  Este metodo espera hasta q ocurra un evento (entren datos al buffer).
En mi caso yo espero hasta q el dispositivo q esta conectado al puerto serial
me indique q él ya se desocupó (y esto lo hace con la bandera DSR en 1, osea true)
o haya transcurrido el tiempo maximo de espera.



Resumiendo todo, el codigo q tengo es este:


--- Código: Text --- public class PuertoSerial{    /*************************************************************     *                      DEFINICION DE LOS ATRIBUTOS                        *     *************************************************************/    /.../     public PuertoSerial() {        /.../          try {            this.puerto.addEventListener( new SerialPortEventListener() {                public void serialEvent( SerialPortEvent evento ) {                    cambioBanderaDSR( evento );                    //DSR es un pin del puerto serial q me indica si el dispositivo q esta                    //  conectado al puerto esta ocupado.                    //Es decir, el disp. q se encuentra conectado al pto. serial del pc,                    //pone esta bandera en 1 para indicarle al pc q esta ocupado y q no lo                    //  moleste, o lo pone en 0 para decirle q esta listo para recibir un                    //  comando o para lo q sea.                                                            }            } );        }        catch ( TooManyListenersException exc ) {}        this.puerto.notifyOnDSR(true); //le digo q me notifiquen cuando haya un                                                     //  cambio de estado en la bandera DSR    }      public synchronized char recibirCaracter( long timeOut ) {        //Mientras q el disp, conectado al pc este ocupado, esperare a q se desocupe        // o hasta q transcurra el tiempo maximo de espera (timeOut)        while ( this.puerto.isDSR() ) {            try {                this.wait( timeOut );            }            catch ( InterruptedException e ) {}        }        if (this.puerto.isDSR() ) {            /...LEER CARACTER.../        }        return '&#092;n';    }     public synchronized void enviarCaracter( char c, long timeOut ) {        //Mientras q el disp, conectado al pc este ocupado, esperare a q se desocupe        // o hasta q transcurra el tiempo maximo de espera (timeOut)        while ( this.puerto.isDSR() ) {            try {                this.wait( timeOut );            }            catch ( InterruptedException e ) {}        }        if (this.puerto.isDSR() ) {            /...ENVIAR CARACTER.../        }        return;    }       /**      * Este es el metodo q se llama cuando ocurre el evento de cambio de      * estado de la bandera DSR q es la indica si el disp. conectado al      * saerial esta o no disponible      */     public synchronized void cambioBanderaDSR( SerialPortEvent evento ) {         if ( evento.getEventType() == SerialPortEvent.DSR ) {             //Si esto es true, entonces el DSR=1 y el disp. conectado al pto.             //  serial esta listo.             // entonces llamo notifyAll para q despierte al wait q llame la ultima ves.             if ( !evento.getNewValue() ) {                  this.notifyAll();             }         }     }}  

...,este es el codigo, q segun lo q tu me dijiste y lo q lei en el libro pude armar,
pero nada silver, no funciona.
..pero se q esto se puede hacer en java, lo q no pense es q me fuera complicar
tanto la vida.

silver, te agradezco q le heches una miradita al codigo, pa' ver q es loq pasa!!!

silverfox:
Hola jpaler...

¿Qué error te deja tu código?

Supongo que lo que terminará haciendo es dejar bloqueadas las Threads que utilizas, ¿no?

Fíjate en una cuestión:


--- Código: Text ---        while ([B] this.puerto.isDSR() [/B]) {           try {               this.wait( timeOut );           }           catch ( InterruptedException e ) {}       }       if ([B]this.puerto.isDSR() [/B]) {             //escribe caracteres       }  Nunca escribirá caracteres, porque es condición para que salga del bucle que puerto.isDSR= false;

Creo recordar que tenías sólo 2 hebras funcionando, ¿has probado si se envía el notify?

Yo cambiaría lo siguiente:
    Crear un método reservarPuerto:
 
--- Código: Text ---   synchronized reservarPuerto(long timeOutMillis) throws TimeOutException{        if (puerto ocupado){             wait(timeOutMillis);             if (se excedió el tiempo) throw new TimeOutException(&#34;Tiempo de espera excedido&#34;);        }        else {            ocupado= true;        }    }     
    Crear un método devolverPuerto:

--- Código: Text ---    synchronized devolverPuerto(){        //aqui reseteas todos los flags del puerto y lo pones en modo de espera de comandos         this.notifyAll();  //esta es la última instrucción y despierta a todos los dormidos en el wait, de los cuales el más rápido reservará el puerto    } 

En todos los métodos que usen el recurso compartido, será obligatorio reservarlo y liberarlo:


--- Código: Text ---synchronized void escribir puerto(){    reservarPuerto();    . . .    devolverPuerto();    return;} 
Y con esto debería funcionarte sin problemas.


Espero haberme explicado correctamente. Echare un vistazo a algunos libros a ver si puedo recomendarte alguno. De momento, te remito a uno que se llama Concurrent Programming with Java, de Prentice Hall.


Suerte, si tienes más dudas, dilo y trataré de explicarlo mejor.
Un saludo.



Silverfox

Navegación

[0] Índice de Mensajes

[*] Página Anterior

Ir a la versión completa