求助:C# chart实时作图拖动卡顿的问题

SummerLee12 2017-09-18 04:32:19
大家好,我用VS2010自带的chart控件作一个实时的接收曲线图,曲线图需要显示从接收开始的全局视野,主窗体收到一个数据并处理后,把这个数据传到作图的窗体,然后用series.Points.AddY画点,收到数据间隔大概是200ms。
问题是:当作图运行一段时间后,拖动窗口开始有卡顿感,时间越长卡顿越严重,停止作图后卡顿消失。
一开始其实是直接在主窗体调用作图窗体作图函数,试了在网上找的begininvoke方法,问题依然存在,所以求问这个现象是什么原因造成的?应该如何解决?谢谢了!
现在画图代码如下:

public delegate void drawHandler(double speed);
private event drawHandler OnDraw;
public void AddPoint(double speed)//主界面收到数据后调用这个方法
{
OnDraw=new drawHandler(receive_data);
this.BeginImvoke(OnDraw,speed);
}
void receive_data(double speed)
{
...
chart1.Series[0].Points.AddY(speed);
...
}


...全文
724 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
楼主,你的这个问题可以用我制作的曲线控件解决,我也遇到过该类问题,可以看看我的贴子。
回复
楼主,我已解决了这个问题,看看我的帖子吧!
回复
xuzuning 2017-09-19
由于需要观测异常值(出现突变的峰值),所以不能考虑每几个点求平均作图! 平均值将掩盖异常值 需要长时间监测,但过往的数据是不会再变化了,每当新增数据时就将历史图形重绘一遍,显然是低效的 所以建议你放弃现成的图表控件,而改为自行绘制 绘制到 Bitmap 中的图形是不会丢失的,你只需每次绘制新增的线段即可
回复
SummerLee12 2017-09-19
引用 5 楼 homesos 的回复:
[quote=引用 3 楼 kangmao2809 的回复:] [quote=引用 1 楼 homesos 的回复:] 点太多了吧,要都显示吗?还是只要显示最新一段时间的?
需要长时间监测,可能最长3个月,数据显示需要整体的,因为需要观测异常值(出现突变的峰值),倒不需要能看清每一个点,但特征值必须保留,在考虑每几个点求平均作图[/quote] 200ms的间隔,那点太多了,还是考虑局部绘制吧,拖动到哪,显示哪的数据,其余的不显示,或用前后两个按钮移动,相当于分页翻页,不然肯定吃不消。[/quote] 实际应用的时候时间间隔可以到500ms,不过好像也没有宽松太多,谢谢建议,会考虑这样
回复
homesos 2017-09-19
引用 3 楼 kangmao2809 的回复:
[quote=引用 1 楼 homesos 的回复:] 点太多了吧,要都显示吗?还是只要显示最新一段时间的?
需要长时间监测,可能最长3个月,数据显示需要整体的,因为需要观测异常值(出现突变的峰值),倒不需要能看清每一个点,但特征值必须保留,在考虑每几个点求平均作图[/quote] 200ms的间隔,那点太多了,还是考虑局部绘制吧,拖动到哪,显示哪的数据,其余的不显示,或用前后两个按钮移动,相当于分页翻页,不然肯定吃不消。
回复
SummerLee12 2017-09-19
引用 2 楼 sp1234 的回复:
不知道你为什么要使用 BeginInvoke。如果没有具体理由原理做保证(就只是“听说”这样写代码可以),那么 BeginInvoke 只会让你的程序更慢,怎么会变快呢? 这其实是一个系统工程问题。你的“...”的代码可能才是花费了主要时间的部分,同时也可能是 chart1.Series[0] 数据剪裁不准确,或者和你应该换一套绘图框架。一般的人最喜欢最后这一点,因为觉得自己换一套组件能更方便地给外行证明自己“会了”。而程序设计师不换控件话,就要系统性的做测试,前提是了解源代码和设计思路,而无法乱猜。
用begininvoke想的是异步会不会能让主UI流畅一点,省略部分的代码是求一定点数的均值。 换专业控件目前还没有考虑。 我认为问题还是在chart上绑定了太多点,根据MSDN的建议把曲线更改为折线后,卡顿出现的时间明显延后,但是这样应该还是会有个上限,对我的长时间观测还是不满足。 目前的思路是到一定点后,每2个点取一次平均作图,随着点增多还需增加取平均的个数,总之是要控制目前视窗点的个数,不知道会不会管用,试一试再来。
回复
SummerLee12 2017-09-19
引用 1 楼 homesos 的回复:
点太多了吧,要都显示吗?还是只要显示最新一段时间的?
需要长时间监测,可能最长3个月,数据显示需要整体的,因为需要观测异常值(出现突变的峰值),倒不需要能看清每一个点,但特征值必须保留,在考虑每几个点求平均作图
回复
SummerLee12 2017-09-19
引用 7 楼 xuzuning 的回复:
由于需要观测异常值(出现突变的峰值),所以不能考虑每几个点求平均作图! 平均值将掩盖异常值 需要长时间监测,但过往的数据是不会再变化了,每当新增数据时就将历史图形重绘一遍,显然是低效的 所以建议你放弃现成的图表控件,而改为自行绘制 绘制到 Bitmap 中的图形是不会丢失的,你只需每次绘制新增的线段即可
观测对象的值域基本比较稳定,取均值还是可以有体现的 您说的Bitmap我会去了解一下,谢谢!
回复
不知道你为什么要使用 BeginInvoke。如果没有具体理由原理做保证(就只是“听说”这样写代码可以),那么 BeginInvoke 只会让你的程序更慢,怎么会变快呢? 这其实是一个系统工程问题。你的“...”的代码可能才是花费了主要时间的部分,同时也可能是 chart1.Series[0] 数据剪裁不准确,或者和你应该换一套绘图框架。一般的人最喜欢最后这一点,因为觉得自己换一套组件能更方便地给外行证明自己“会了”。而程序设计师不换控件话,就要系统性的做测试,前提是了解源代码和设计思路,而无法乱猜。
回复
homesos 2017-09-19
点太多了吧,要都显示吗?还是只要显示最新一段时间的?
回复
相关推荐
发帖
C#
创建于2007-09-28

10.6w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2017-09-18 04:32
社区公告

让您成为最强悍的C#开发者