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

时间:2011-11-09 15:24:07

标签: c# wpf multithreading simulation

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

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

...我使用MVVM模式在WPF中实现了可视化工具,我希望这个可视化工具,一旦开始模拟,就会在正确的时间间隔内显示每次迭代的状态。因此,如果每次迭代代表1秒的时间间隔,我希望每秒可视化器改变可视化状态。我使用可视化器中的计时器和模拟器中的状态缓冲区来完成它。基本上,模拟器将队列和可视化器中的计算状态排队,并为每个计时器标记排队状态。它适用于一些例外情况。

  1. 很难有恒定的时间间隔(它取决于进程,线程优先级等),因此如果可视化器计时器比模拟器计时器或其他方式当vizualizer更快时,队列将变为无穷大。
  2. 使用队列和我希望可视化的每个数据的实现代码在我看来都是实现时间开​​销和内存开销。
  3. 所以我在考虑替代解决方案。我在可视化器中有一个计时器,并且对于计时器的每个计时器,在后台线程中调用用于计算模拟器中的新迭代的异步方法。在可视化工具中的异步回调中,可视化工具根据模拟器中的新计算状态刷新可视化。使用这种方法我在刷新模拟器的组件时遇到问题,因为它们需要更多的时间来刷新然后一个定时器间隔持续时间。也许我可以在新的后台线程中刷新组件,一旦完成更新,只需在组件中调用方法,将新值复制到组件的参数值。

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

    如果您可以告诉我哪种方法更好,哪些方法可以改进方法,如果有人有更好的方法,我会很乐意阅读并使用它,这将会很有帮助。)

    感谢。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

<块引用>

inotifypropertychanged

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