Re: [Monobotics-develop] [ES] Suscripcion y cancelacion de la suscripcion al evento DataReceived Se
Brought to you by:
buhochileno
From: <buh...@gm...> - 2009-11-10 17:26:22
|
Hi, creo que aqui parte del problema puede ser la logica que tal vez deba ser mejorada y no estoy seguro si con algun parche se pueda arreglar...veamos... Si tienes dos lugares donde se llama a la subscripcion (cuando se carga el CM1 y el otro cuando se va a recivir un aviso desde la interfaz), entonces puede que en algun momento tengas 2 veces el mismo evento asociado al mismo handler this.InterfaceDataReceived (puesto se habrian hecho 2 "+=" al mismo handler), esto quiere decir que cuando el evento se gatilla llama 2 veces al mismo handler. Esto convierte su codigo en "seccion critica", puesto como bien sabes la ejecucion de los eventos es asyncrona al codigo que los subscribe, por lo tanto es como si estuvieran en hilos de ejecucion separados. Incluso pueden haber cambios de contexto de los hilos a media ejecucion de una de las llamadas al handler y luego intervenga la otra... Por supuesto una forma de tratar de mejorar esto es controlando la ejecucion de la zona critica con los semaforo: lock(this) //no necesariamente es el "this" el objeto bloqueador, documentarse sobre semaforos y "lock" en msdn/google { //codigo del handler--- } Pero tambien de la misma forma, y debido a esta ejecucion asyncrona es que se me ocurre que cuando haces la cancelacion de la subscripcion ("-="), a cual subscripcion del manejador la estas haciendo?, eso no se puede controlar, porque los eventos son una forma de multicast y .net/mono no te pueden asegurar que porque hagas un "-=" despues de dos o mas "+=" estaras cancelando siempre la ultima (en realidad en la mayoria de los casos asi deberia ser, pero el framework no te lo puede asegurar..) Finalmente la cancelacion de la subscripcion puede ocurrir tambien mientras alguna de las subscripciones al handler se esta ejecutando, incluyendo tambien un cambio de contexto y de nuevo problemas por seccion critica... insisto en que se deberia poder mejorar la logica y a eso agregar algunos semaforos por ahi, con el diseño actual no estoy 100% que no ocurra ninguno de estos problemas en ningun momento... Mauricio Jaime Alvarado wrote: > Hola. > Este es el código. > protected void UnSubscribeToDataReceived() > { > ISE.IConsole.Write("UnSubscribeToDataReceived"); > try > { > this.serialport.DataReceived -= this.InterfaceDataReceived; > } > catch(Exception e) > { > ISE.IConsole.Write(e.Message); > } > // el try-catch es para ver si me devolvia algo el mensaje pero no > devuelve ningun mensaje > } > > protected void SubscribeToDataReceived() > { > ISE.IConsole.Write("SubscribeToDataReceived"); > try > { > this.serialport.DataReceived -= new > SerialDataReceivedEventHandler( this.InterfaceDataReceived ); > } > catch(Exception e) > { > ISE.IConsole.Write(e.Message); > } > } > > Tengo dos códigos, el primero activo la suscripción solo cuando voy a > recibir un aviso desde la interface (el mensaje de la interfaz que me > indica, que se acaba de ejecutar un timer) el segundo es donde activo > la suscripción apenas se carga el objeto CM11 a la escena, entonces > como le indicado otras veces, la interfaz me avisa para que le > configure el reloj, eso lo hace bien, ahora cuando yo quiero realizar > otra acción que ocupe el puerto serial, tengo que cancelar la > suscripción, hay es donde siempre se cae. > > *From:* Mauricio Heneiquez <mailto:buh...@gm...> > *Sent:* Tuesday, November 10, 2009 7:11 AM > *To:* Jaime Alvarado <mailto:obe...@ho...> > *Cc:* monoBOTICS Developers > <mailto:mon...@li...> > *Subject:* Re: [Monobotics-develop] [ES] Suscripcion y cancelacion de > la suscripcion al evento DataReceived SerialPort > > Podrías agregar código de como te subscribes/dessubscribes al > evento?..además de más info sobre "al rato se cuelga", más precicion > please, que se esta haciendo en ese momento, cada cuanto tiempo, > determinar si es cuando llega un xxx dato, etc... > > Puede ser un tema de acceso a recursos que se pueda resolver con un > semáforo (lock(this)) o algo por el estilo.. > > Si es válido registraras y desregistrarse constantemente de un evento > en mono, solo se debe tener cuidado con las secciones críticas...esto > daría problemas en .net de igual forma... > > Mauricio Henriquez > Escuela de Computacion > Universidad Austral de Chile > Puerto Montt > > El 09/11/2009, a las 23:54, "Jaime Alvarado" > <obe...@ho... > <mailto:obe...@ho...>> escribió: > >> Hola. >> Tengo un objeto SerialPort y estoy suscrito al evento DataReceived. >> A este evento, me suscribo y cancelo esta suscripción continuamente, >> funciona bien pero al rato deja de funcionar, cuando cancelo la >> suscripción se cae y estoy obligado a apretar Ctrol+Alt+BackSpace. >> Estas suscripciones y cancelaciones de suscripción las hago mediante >> un método, en donde encierro en un try la línea especifica que >> realiza la suscripción y en el catch imprimo el mensaje de la >> excepción pero el mensaje nunca se muestra. >> ¿Es valido suscribirse continuamente a un evento en Mono? >> Saludos. >> ------------------------------------------------------------------------------ >> Let Crystal Reports handle the reporting - Free Crystal Reports 2008 >> 30-Day >> trial. Simplify your report design, integration and deployment - and >> focus on >> what you do best, core application coding. Discover what's new with >> Crystal Reports now. http://p.sf.net/sfu/bobj-july >> _______________________________________________ >> Monobotics-develop mailing list >> Mon...@li... >> <mailto:Mon...@li...> >> https://lists.sourceforge.net/lists/listinfo/monobotics-develop |