繁体   English   中英

WPF C# .NET 中实时仿真过程的可视化

[英]Visualization of real-time simulation process in WPF C# .NET

我的模拟过程由迭代组成,其中模拟器计算一些数据,并以这种方式,在每次迭代中,通过离散时间移动。 除此之外,模拟器必须在某些周期性间隔内用新数据更新组件参数。 模拟器的组件用于计算迭代。

我当前的模型基于间隔为 20 秒的计时器。 对于每个计时器滴答,模拟器首先尽可能快地计算 20 次迭代,然后在其余时间(20 秒 - 模拟 20 次迭代的时间),如果新数据可用,它将使用新数据更新组件参数。 它的效果很好,但是...

...我使用 MVVM 模式在 WPF 中实现了可视化器,并且我希望该可视化器在模拟开始后,以正确的时间间隔显示每次迭代的状态。 因此,如果每次迭代代表 1 秒的时间间隔,我希望可视化器每秒更改可视化状态。 我使用可视化器中的计时器和模拟器中的状态缓冲区来完成它。 基本上,模拟器将计算出的状态排入队列,而可视化器将每个计时器滴答的状态排入队列。 它运行良好,但有一些例外。

  1. 很难有恒定的滴答间隔(它取决于进程、线程优先级等),因此如果可视化器计时器比模拟器计时器慢或其他方式当可视化器更快时,队列将无限大。
  2. 对我想可视化的每个数据使用队列和实现代码在我看来是实现时间开​​销和内存开销。

所以我在考虑替代解决方案。 我在可视化器中有一个计时器,并且对于计时器的每个滴答声,在后台线程中调用在模拟器中异步计算新迭代的方法。 在可视化器中的异步回调中,可视化器根据模拟器中的新计算状态刷新可视化。 使用这种方法,我在刷新模拟器的组件时遇到问题,因为它们需要更多的时间来刷新,然后是一个计时器间隔持续时间。 也许我可以在新的后台线程中刷新组件,一旦更新完成,只需调用组件中的方法,将新值复制到组件的参数值。

此外,模拟器是实时的,因此它必须与实时保持同步。

如果您能告诉我哪种方法更好以及我如何改进方法,那将会很有帮助,而且如果有人有更好的方法,我会很高兴阅读并使用它:)

谢谢。

由于您使用的是 WPF,如果您使用数据绑定,您的 UI 将在数据更新时自动更新——但有一些例外,主要是ObservableCollections 中的项目。 如果您使用ObservableCollections ,则必须绑定到集合中的每个单独项目。 您可以手动执行此操作或编写从 OC 派生的类,该类在添加项目时执行并在删除项目时分离(这对于避免内存泄漏很重要)

除了使用计时器进行更新,您还可以在使用mvvm 架构时在 wpf 中使用数据绑定,并且最好包含 **

通知属性已更改

** 在您的视图模型中类并将元素直接绑定到组件,这样您的问题就会得到解决

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM