Pregunta

En una señal digital a un sistema de adquisición, a menudo los datos es empujado a un observador en el sistema por un hilo.

ejemplo de Wikipedia/Observer_pattern:

foreach (IObserver observer in observers)
    observer.Update(message);

Cuando, por ejemplo,una acción del usuario, por ejemplo, deuna interfaz gráfica de usuario-hilo exige que los datos a dejar de fluir, se quiere romper el sujeto-observador de conexión, e incluso disponer de el observador de manera consecutiva.

Uno puede argumentar:sólo debe dejar de la fuente de datos, y esperar por un valor de centinela para disponer de la conexión.Pero que incurrir en más de latencia en el sistema.

Por supuesto, si los datos de bombeo hilo ha preguntado por la dirección del observador, se puede encontrar mediante el envío de un mensaje a una destruido objeto.

Alguien ha creado un 'oficial' Patrón de Diseño de la lucha contra esta situación?No?

¿Fue útil?

Solución

Si usted quiere tener la fuente de datos para estar siempre en el lado seguro de la concurrencia, usted debe tener al menos un puntero que siempre es seguro para que lo use.De modo que el Observador, el objeto debe tener una vida útil que no terminó antes de que de la fuente de datos.

Esto se puede hacer sólo por la adición de los Observadores, pero nunca la eliminación de ellos.Usted podría tener cada observador no hacer el núcleo de la aplicación en sí misma, sino que tiene que delegar esta tarea a un ObserverImpl objeto.Bloquear el acceso a este impl objeto.Esto no es gran cosa, simplemente significa que el GUI unsubscriber sería bloqueado por un poco de tiempo en caso de que el observador está ocupado con la ObserverImpl objeto.Si GUI capacidad de respuesta sería un problema, puede utilizar algún tipo de trabajo simultáneos-mecanismo de cola con una suscripción de trabajo que se inserta en ella.( como PostMessage en Windows )

Cuando la cancelación de la suscripción, usted acaba de sustituir el núcleo de la implementación de un maniquí de aplicación.De nuevo esta operación debe agarrar la cerradura.Este sería, de hecho, introducir algunos de espera para el origen de datos, pero dado que es sólo una [ lock - puntero de intercambio - desbloquear ] se podría decir que este es lo suficientemente rápido para aplicaciones en tiempo real.

Si usted quiere evitar el apilamiento de Observador objetos que sólo contienen un maniquí, usted tiene que hacer algún tipo de contabilidad, pero esto podría reducirse a algo trivial, como un objeto que mantiene un puntero a el Observador el objeto que necesita de la lista.

Optimización :Si usted también mantener las implementaciones ( el real + el dummy ) viva como el Observador de sí mismo, usted puede hacer esto sin un bloqueo efectivo, y usar algo como InterlockedExchangePointer para cambiar los punteros.Escenario del peor caso :delegar la llamada que está pasando mientras que el puntero se intercambia --> no es gran cosa todos los objetos de permanecer vivo y la delegación de poder continuar.El próximo delegar llamar a nueva implementación del objeto.( Salvo alguna nueva swaps de curso )

Otros consejos

Usted podría enviar un mensaje a todos los observadores se les informa de la fuente de datos es terminar y dejar que los observadores borrarse de la lista.

En respuesta a la observación, la aplicación del sujeto-observador patrón debe permitir para la dinámica de la adición / eliminación de los observadores.En C#, el sistema de eventos es un sujeto/observador patrón en el que los observadores se agregan utilizando event += observer y eliminan con event -= observer.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top