2011-11-09 53 views
1

实时模拟过程的我有仿真的过程,由其中模拟器计算一些数据,并以这种方式,与每个迭代的迭代,移动通离散时间。除了该模拟器之外,还必须在某些周期性时间间隔内用新数据更新组件参数。模拟器的组件用于计算迭代。可视化WPF C#的.NET

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

...我使用MVVM模式来实现可视化WPF中,我想的是可视化,一旦当模拟开始,显示了正确的时间间隔每次迭代的状态。因此,如果每次迭代都代表1秒钟的时间间隔,我希望每秒可视化工具改变可视化状态。我使用可视化器中的timer和模拟器中的状态缓冲区来完成它。基本上模拟器将队列中的计算状态排队,可视化器为每个计时器滴答排队状态。除了一些例外,它运作良好。

  1. 这很难具有恒定周期的时间间隔(这取决于过程,线程的优先级等),所以队列将会无限如果观察仪计时器是慢然后模拟器计时器或其它周围的方式,当vizualizer更快。
  2. 使用队列和实现代码为我想要可视化的每个数据在我看来都是实现时间开​​销和内存开销。

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

而且模拟器是实时的,所以必须跟上实时步伐。

这将是有益的,如果你能告诉我什么方法更好,我怎么能改善方案也如果有人有更好的方法,我将高兴地阅读它,使用它:)

感谢。

回答

1

因为您使用的是WPF,所以如果您使用的是databinding,那么您的用户界面将在数据更新时自动更新 - 除了一些例外,主要是ObservableCollections中的项目。如果您使用ObservableCollections,则必须绑定到集合中的每个单独项目。你可以做手工或写信OC,做它,当你添加一个项目,当您去除项目

+0

我说,我使用MVVM模式(以避免内存泄漏,这是重要的)分离得到的一类,但我有一个例外,我的模型没有以正常方式实施的“inotify property changed”。我在可视化器中定时器调用视图模型的更新方法,然后读取模拟器的状态,然后在viewmodel属性发生变化时,inotifypropertychanged被提起。 – Vedran

+0

您是否尝试过自动(“正常”方式)更新而不是手动? –

+0

我没有,因为我不希望该模型知道视图模型,因为模型可以在控制台应用程序中使用,不仅仅是基于WPF的应用程序。但是我正在考虑这种模式会引起无足轻重的变化。另外我想这会考虑秒的方法。 – Vedran