WPF实时图表应用程序架构

时间:2013-10-18 15:05:25

标签: c# wpf charts prism

我有以下几种情况:

我想(通过串口)向设备发送一些命令。该设备确实向我发回连续的数据流(每秒最多12000个值)。

要控制某些设置,我需要一些按钮来向设备发送命令,以便在数据流之前和期间启动/停止/更改设置。另外,我想要获得这些数据的实时情节。我当然会过滤这些数据。此外,在某些时间戳上会有一个信号表明我想要删除接收数据的某个窗口。

这意味着我将有两张图表。我使用WPF已经取得了一些进展,但现在当我与下方图表进行交互(缩放/平移)时,上面的一个会显着冻结。这是因为两者都经常刷新!

使用线程完成工作(数据接收/过滤),但是必须在ui线程内完成绘图的更新。

任何想法如何解决这个问题?也许使用多个流程?

enter image description here

3 个答案:

答案 0 :(得分:3)

您应该使用Reactive Extensions。它是为这种东西而建的。

http://msdn.microsoft.com/en-us/data/gg577609.aspx

Requesting a clear, picturesque explanation of Reactive Extensions (RX)?

在第二个链接上,虽然主题是javascript,但它所说的大部分内容都是关于Reactive Extensions并在C#中交叉应用于Rx。

答案 1 :(得分:2)

我正在使用实时波形(约500Hz)制作类似的WPF应用程序。我有一个接收实时数据的后台线程,一个单独的线程来处理它们并准备绘图数据(我有一个缓冲区,其中包含" size"我放置准备好的值的屏幕)。在UI线程中,我将波形绘制到 RenderTargetBitmap ,最后渲染到Canvas。这种技术允许我在屏幕上有很多实时波形,并且可以毫无问题地进行变焦和平移工作(大约40-50 fps)。

如果您需要一些技术细节,请告诉我,我可以稍后与您分享。

我认为你在UI线程中有一些代码没有很好地优化,或者可以移动到后台线程。

顺便问一下,您是否使用任何图表框架?

修改

philologon 是对的,你应该使用Rx作为实时数据,它简化了代码A LOT。我也在我的项目中使用它们。

答案 2 :(得分:1)

它是一个商业产品,但有一个实时的WPF图表可以处理这个用例,然后一些。请看下面的教程:

http://www.scichart.com/synchronizing-chartmodifier-mouse-events-across-charts/

enter image description here

这里有一个关于此行为的实时Silverlight演示:

Sync Multichart Mouse Silverlight Demo

此图表应该能够在高速输入值时处理缩放:

Realtime Performance Demo

披露:我是SciChart的所有者和技术主管