Визуализация процесса моделирования в реальном времени в WPF C # .NET - PullRequest
1 голос
/ 09 ноября 2011

У меня есть процесс моделирования, который состоит из итераций, в которых симулятор вычисляет некоторые данные и таким образом, с каждой итерацией, перемещается на дискретное время.Помимо этого симулятор должен периодически обновлять параметры компонентов новыми данными.Компоненты симулятора используются при расчете итераций.

Моя текущая модель основана на таймере с интервалом в 20 секунд.Для каждого тика таймера симулятор сначала рассчитывает 20 итераций как можно быстрее, а в остальное время (20 секунд - время симуляции 20 итераций) обновляет параметры компонентов новыми данными, если новые данные доступны.Это работает очень хорошо, но ...

... я реализовал визуализатор в WPF с использованием шаблона MVVM, и я хочу, чтобы этот визуализатор, один раз при запуске симуляции, отображал состояние каждой итерации в нужный интервал времени.Поэтому, если каждая итерация представляет интервал времени в 1 секунду, я хочу, чтобы визуализатор каждую секунду изменял состояние визуализации.Я сделал это с помощью таймера в визуализаторе и буфера для состояний в симуляторе.В основном симулятор ставит в очередь вычисленные состояния в очередях, а состояния визуализатора - для каждого таймера.Он хорошо работает с некоторыми исключениями.

  1. Трудно иметь постоянный интервал тиков (это зависит от процесса, приоритета потока и т. Д.), Поэтому очередь уходит в бесконечность, если таймер визуализатора медленнее, чем таймер симулятора илинаоборот, когда vizualizer работает быстрее.
  2. Использование очередей и реализации кода для всех данных, которые я хочу визуализировать, кажется мне издержками времени реализации и памяти.

Так что я былдумать об альтернативном решении.То, что у меня есть один таймер в визуализаторе и на каждый тик таймера, асинхронный метод для расчета новой итерации в симуляторе вызывается в фоновом потоке.При асинхронном обратном вызове в визуализаторе визуализатор обновляет визуализацию на основе нового вычисленного состояния в симуляторе.При таком подходе у меня возникают проблемы с обновлением компонентов симулятора, потому что им требуется больше времени для обновления, чем продолжительность одного интервала таймера.Может быть, я мог бы поместить обновление компонентов в новый фоновый поток, и как только обновление будет выполнено, просто вызовите метод в компонентах, который скопирует новое значение в значение параметров компонентов.

Кроме того, симулятор работает в режиме реального времени, поэтому он должен сохранятьидти в ногу с реальным временем.

Было бы полезно, если бы вы могли сказать мне, какой подход лучше и как я могу улучшить подходы, но также, если у кого-то есть лучший подход, я был бы рад прочитать его и использовать его:)

Спасибо.

1 Ответ

1 голос
/ 09 ноября 2011

поскольку вы используете WPF, если вы используете привязку данных , ваш пользовательский интерфейс будет автоматически обновляться при обновлении данных - с некоторыми исключениями, в основном это элементы ObservableCollections . Если вы используете ObservableCollections , вам придется привязывать каждый отдельный элемент в коллекции. Вы можете сделать это вручную или написать класс, производный от OC, который делает это при добавлении элемента и отключается при удалении элемента (это важно во избежание утечек памяти)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...