【问题标题】:Visualization of real-time simulation process in WPF C# .NETWPF C# .NET中实时仿真过程的可视化
【发布时间】:2023-03-18 05:40:01
【问题描述】:

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

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

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

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

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

而且模拟器是实时的,所以它必须与实时保持同步。

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

谢谢。

【问题讨论】:

    标签: c# wpf multithreading simulation


    【解决方案1】:

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

    【讨论】:

    • 我说我使用的是 MVVM 模式,但我有一个例外,我的模型没有以正常方式实现“inotify property changed”。我在可视化器中有一个计时器,它调用视图模型的更新方法,然后读取模拟器的状态,然后在更改视图模型属性时,引发 inotifypropertychanged。
    • 您尝试过自动(“正常”方式)更新而不是手动更新吗?
    • 我没有,因为我不希望那个模型知道视图模型,因为模型可以在控制台应用程序中使用,而不仅仅是基于 WPF 的应用程序。但我正在考虑该模型会引发 inotifyproperty 更改。另外我想这会考虑秒方法。
    • 您可以将其设为 iNotifyPropertyChange... 控制台不会关心它...您甚至可以添加某种类型的布尔值,以便它“知道”它处于控制台模式,因此不会引发更改事件
    【解决方案2】:

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

    inotifypropertychanged

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-14
      • 2016-05-04
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多