У меня есть процесс моделирования, который состоит из итераций, в которых симулятор вычисляет некоторые данные и таким образом, с каждой итерацией, перемещается на дискретное время.Помимо этого симулятор должен периодически обновлять параметры компонентов новыми данными.Компоненты симулятора используются при расчете итераций.
Моя текущая модель основана на таймере с интервалом в 20 секунд.Для каждого тика таймера симулятор сначала рассчитывает 20 итераций как можно быстрее, а в остальное время (20 секунд - время симуляции 20 итераций) обновляет параметры компонентов новыми данными, если новые данные доступны.Это работает очень хорошо, но ...
... я реализовал визуализатор в WPF с использованием шаблона MVVM, и я хочу, чтобы этот визуализатор, один раз при запуске симуляции, отображал состояние каждой итерации в нужный интервал времени.Поэтому, если каждая итерация представляет интервал времени в 1 секунду, я хочу, чтобы визуализатор каждую секунду изменял состояние визуализации.Я сделал это с помощью таймера в визуализаторе и буфера для состояний в симуляторе.В основном симулятор ставит в очередь вычисленные состояния в очередях, а состояния визуализатора - для каждого таймера.Он хорошо работает с некоторыми исключениями.
- Трудно иметь постоянный интервал тиков (это зависит от процесса, приоритета потока и т. Д.), Поэтому очередь уходит в бесконечность, если таймер визуализатора медленнее, чем таймер симулятора илинаоборот, когда vizualizer работает быстрее.
- Использование очередей и реализации кода для всех данных, которые я хочу визуализировать, кажется мне издержками времени реализации и памяти.
Так что я былдумать об альтернативном решении.То, что у меня есть один таймер в визуализаторе и на каждый тик таймера, асинхронный метод для расчета новой итерации в симуляторе вызывается в фоновом потоке.При асинхронном обратном вызове в визуализаторе визуализатор обновляет визуализацию на основе нового вычисленного состояния в симуляторе.При таком подходе у меня возникают проблемы с обновлением компонентов симулятора, потому что им требуется больше времени для обновления, чем продолжительность одного интервала таймера.Может быть, я мог бы поместить обновление компонентов в новый фоновый поток, и как только обновление будет выполнено, просто вызовите метод в компонентах, который скопирует новое значение в значение параметров компонентов.
Кроме того, симулятор работает в режиме реального времени, поэтому он должен сохранятьидти в ногу с реальным временем.
Было бы полезно, если бы вы могли сказать мне, какой подход лучше и как я могу улучшить подходы, но также, если у кого-то есть лучший подход, я был бы рад прочитать его и использовать его:)
Спасибо.