首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

MFC实时接收数据作图曲线出现的BUG!求解答!

2012-09-24 
MFC实时接收数据绘制曲线出现的BUG!!求解答!!绘图逻辑:1、为相应的界面建立绘图的类,包括存储各种数据的变

MFC实时接收数据绘制曲线出现的BUG!!求解答!!
绘图逻辑:

1、为相应的界面建立绘图的类,包括存储各种数据的变量及绘图函数。

2、在多线程中接收数据并进行解包,将相应的数据存入各个变量中。每接到一条数据即发送消息启动界面重绘,
在重绘函数中调用各个绘图类的方法进行对应图形的绘制,此处绘点函数所读取的数据是在接受数据线程中存入
到各变量的数据。

3、在重绘函数OnPaint()中,获取当前dc,设置映射模式,建立与dc兼容的内存memdc,并绑定bitmap对象,具体
绘图在内存memdc中进行(将memdc作为参数传入各个绘图函数中),完成绘图后将内存memdc拷贝到dc上,实现图
形的显示

存数据的变量:使用<vector>类型定义的可变长数组。无数据是为空,新增的数据添加在数组尾端,读取时从头
至尾读取。

遇到的问题:
一般情况下,每隔大概500毫秒接收一个数据,共一万多条数据,绘制成功,程序正常运行。但是在发送端加快发
送速率的情况下,绘制一段时间后程序报错,在绘点函数中出现读取数据错误,访问冲突。

自分析:由于需要接收不同端口的实时数据,接收数据的频率会出现峰值,两条数据之间的间隔可能只有几毫秒,
而重绘过程不可能在如此短的时间内完成,造成数据读取与写入发生冲突,程序终止。

求问题分析及解决方案啊!!!!



[解决办法]
个人感觉你对出错原因的分析是正确的,给你个建议供参考:
好像你每接收一个新数据的时候都要调用OnPaint()函数重画容器Vector<>里面的全部数据,这样当然不行!即使程序不崩溃,如果你仔细观察的话,会发现曲线是越画越慢,因为vector<>里面的数据越来越多,明白?
解决方法:
1.自定义一个消息响应函数,例如afx_msg LRESULT OnResponse(WPARAM wparam,Lparam lparam)。在这个函数里面仅仅补画最近一次接收过来的数据,先前接收的数据一律不画;
2.当窗口移动时,MFC会自动调用OnPaint()函数,在这个函数里面重画全部vector<>数据即可。
这样的话,绘制曲线的速度是恒定的,也不会受接收数据速率的影响,当然如果你的机子太烂也没办法。
[解决办法]
这你得搞2线程2缓冲区把,保证数据在一个缓冲区在被绘制的时候有另一个buffer可以去
当然如果绘制是异步的话一个线程就行

热点排行