Visualización del proceso de simulación en tiempo real en WPF C # .NET

Tengo un proceso de simulación que consiste en iteraciones en las que el simulador calcula algunos datos y de esa manera, con cada iteración, se mueve a través de un tiempo discreto. Más allá de ese simulador, en algunos intervalos periódicos, los parámetros de los componentes deben actualizarse con nuevos datos. Los componentes del simulador se utilizan en el cálculo de iteraciones.

Mi modelo actual se basa en un temporizador que tiene un intervalo de 20 segundos. Para cada tic del temporizador, el simulador primero calcula 20 iteraciones lo más rápido posible y durante el resto del tiempo (20 segundos - tiempo para simular 20 iteraciones) actualiza los parámetros de los componentes con nuevos datos, si hay nuevos datos disponibles. Funciona muy bien, pero ...

... implementé el visualizador en WPF usando el patrón MVVM y quiero que el visualizador, una vez que se inicia la simulación, muestre el estado de cada iteración en el intervalo de tiempo correcto. Entonces, si cada iteración representa un intervalo de tiempo de 1 segundo, quiero que el visualizador cambie cada segundo el estado de visualización. Lo hice usando el temporizador en el visualizador y el búfer para los estados en el simulador. Básicamente, el simulador pone en cola los estados calculados en las colas y el visualizador retira los estados para cada tic del temporizador. Funciona bien con algunas excepciones.

  1. Es difícil tener un intervalo de tic constante (depende del proceso, la prioridad del subproceso, etc.), por lo que la cola se va al infinito si el temporizador del visualizador es más lento que el temporizador del simulador o al revés cuando el visualizador es más rápido.
  2. El uso de colas y código de implementación para cada dato que quiero visualizar me parece una sobrecarga de tiempo de implementación y una sobrecarga de memoria.

Entonces estaba pensando en una solución alternativa. Que tengo un temporizador en el visualizador y para cada tic del temporizador, el método asincrónico para el cálculo de la nueva iteración en el simulador se llama en el hilo de fondo. En la devolución de llamada asíncrona en el visualizador, el visualizador actualiza la visualización en función del nuevo estado calculado en el simulador. Con este enfoque, tengo problemas para actualizar los componentes del simulador, porque necesitan más tiempo para actualizar que la duración del intervalo de un temporizador. Tal vez podría poner la actualización de los componentes en un nuevo hilo de fondo y una vez que se realiza la actualización, simplemente llame al método en los componentes que copiarán el nuevo valor al valor de los parámetros de los componentes.

Además, el simulador es en tiempo real, por lo que debe seguir el ritmo del tiempo real.

Sería útil si me pudiera decir qué enfoque es mejor y cómo puedo mejorar los enfoques, pero también si alguien tiene un mejor enfoque, me encantaría leerlo y usarlo :)

Gracias.

preguntado el 09 de noviembre de 11 a las 15:11

2 Respuestas

ya que está usando WPF, si usa el enlace de datos su interfaz de usuario se actualizará automáticamente cuando se actualicen los datos, con algunas excepciones, principalmente elementos en un Colecciones observables. Si esta usando Colecciones observables, tendría que enlazar a cada elemento individual de la colección. puede hacerlo manualmente o escribir una clase derivada de OC que lo hace cuando agrega un elemento y se separa cuando elimina un elemento (esto es importante para evitar pérdidas de memoria)

respondido 09 nov., 11:19

Dije que estaba usando el patrón MVVM, pero tengo una excepción, mi modelo no tiene "propiedad inotify cambiada" implementada de manera normal. Tengo un temporizador en el visualizador que llama al método de actualización de modelos de vista que luego lee el estado del simulador, y luego, al cambiar la propiedad del modelo de vista, se genera inotifypropertychanged. - Vedran

¿Ha probado las actualizaciones automáticas (la forma "normal") en lugar de las manuales? - Muad'Dib

No lo hice porque no quiero que ese modelo sepa sobre el modelo de vista porque el modelo se puede usar en la aplicación de consola, no solo en la aplicación basada en WPF. Pero estaba considerando que el modelo genera un cambio de propiedad inotify. También supongo que consideraría un enfoque de segundos. - Vedran

podría hacerlo iNotifyPropertyChange ... a la consola no le importará ... incluso podría agregar algún tipo de booleano para que "sepa" que está en el modo de consola y, por lo tanto, no generar los eventos de cambio - Muad'Dib

en lugar de usar el temporizador para actualizar, también puede usar el enlace de datos en wpf mientras estaba usando el arcitucture mvvm y sería bueno incluir el **

inotifypropertychanged

** class en su modelo de vista y vincule los elementos directamente a los componentes para que se resuelva su problema

Respondido el 18 de enero de 21 a las 08:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.