【发布时间】:2023-03-18 05:40:01
【问题描述】:
我的模拟过程由迭代组成,其中模拟器计算一些数据,并以这种方式,在每次迭代中移动通过离散时间。除此之外,模拟器必须在某些周期性间隔内使用新数据更新组件参数。模拟器的组件用于迭代计算。
我当前的模型基于间隔为 20 秒的计时器。对于每个计时器滴答,模拟器首先尽可能快地计算 20 次迭代,然后在剩余时间(20 秒 - 模拟 20 次迭代的时间)中,如果有新数据可用,它会使用新数据更新组件参数。效果很好,但是...
...我使用 MVVM 模式在 WPF 中实现了可视化器,并且我希望该可视化器在模拟开始后在正确的时间间隔内显示每次迭代的状态。因此,如果每次迭代代表 1 秒的时间间隔,我希望该可视化器每秒更改可视化状态。我使用可视化器中的计时器和模拟器中的状态缓冲区来完成它。基本上,模拟器将计算的状态排入队列,可视化器将每个计时器滴答的状态出列。它适用于一些例外情况。
- 很难有恒定的滴答间隔(它取决于进程、线程优先级等),因此如果可视化计时器比模拟器计时器慢,或者当 vizualizer 更快时,队列将无限长。
- 对我想要可视化的每个数据使用队列和实现代码在我看来是实现时间开销和内存开销。
所以我在考虑替代解决方案。我在可视化器中有一个计时器,并且对于计时器的每个滴答声,在后台线程中调用用于计算模拟器中新迭代的异步方法。在可视化器中的异步回调上,可视化器根据模拟器中新计算的状态刷新可视化。使用这种方法,我在刷新模拟器组件时遇到问题,因为它们需要更多时间来刷新,而不是一个计时器间隔持续时间。也许我可以在新的后台线程中刷新组件,一旦更新完成,只需调用组件中的方法,将新值复制到组件的参数值。
而且模拟器是实时的,所以它必须与实时保持同步。
如果您能告诉我哪种方法更好以及如何改进方法,那将很有帮助,如果有人有更好的方法,我会很高兴阅读并使用它:)
谢谢。
【问题讨论】:
标签: c# wpf multithreading simulation