【发布时间】:2010-11-08 13:29:08
【问题描述】:
在 WPF 窗口中,我有一个绘制 实时数据 的折线图(用于 WPF 的 Quinn-Curtis 实时图表)。简而言之,对于每个新值,我调用一个 SetCurrentValue(x, y) 方法,然后调用 UpdateDraw() 方法来更新图表。
数据通过另一个线程中的 TCP 连接传入。每个传入的新值都会引发一个 DataReceived 事件,其处理程序应将该值绘制到图表上,然后对其进行更新。从逻辑上讲,我不能直接调用 UpdateDraw(),因为我的图表在 UI 线程中,这与数据进入的线程不同。
所以我调用 Dispatcher.Invoke(new Action (UpdateDraw()) ) - 只要我更新最大值,它就可以正常工作。 30次/秒。更频繁地更新时,Dispatcher 跟不上,图表更新速度比数据输入慢。我使用模拟数据的单线程情况对此进行了测试,没有 Dispatcher 没有问题。
所以,我的结论是 Dispatcher 对于这种情况来说太慢了。我实际上需要更新 100-200 次/秒!
有没有办法在 Dispatcher 上添加涡轮增压器,或者有其他方法可以解决这个问题吗?欢迎任何建议。
【问题讨论】:
-
您真的需要图表每秒更新 100/200 次吗?或者您只是每秒获得 100/200 个数据包?
-
感谢您的建议,但我们确实需要 100 次更新/秒。请参阅下面我对您的帖子的评论。
-
您使用的是哪种显示器。绝大多数显示器仅以 60Hz 更新,因此尝试以更快的速度推送更新毫无意义。一旦传入数据速率超过监视器帧速率,最好的办法是批量传入数据并每帧更新一次 UI。
-
-1 没有告诉我们你为什么要每秒更新图表 100 次以上。出于此线程中所述的许多原因,这样做绝对不是一个好主意。
-
@Pieter:不,我认为我们不应该将自己局限于技术解决方案。如果有人试图做一些不明显的事情并且不想接受显而易见的解决方案,那么深入挖掘,找出真正的问题是正确的。
标签: c# wpf multithreading