Programación General > Java
Calcular Retardos
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 '\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("Tiempo de espera excedido"); } 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
[*] Página Anterior
Ir a la versión completa