ChartCtrl调用addpoints不定时报afxwin1.ini 666行错误

lishi_1991 2018-01-16 09:54:05
有个项目用到了开源的ChartCtrl画曲线图,我开启了EnableRefresh(false)让控件自动刷新,然后当有数据来时调用
pLineSerie1->ClearSerie();
pLineSerie1->AddPoints(x, dYValue,DATA_COUNT);

画坐标曲线,运行一段时间后会出现报错,afxwin1.ini 666行错误,错误代码是:
VERIFY(::GetTextExtentPoint32(m_hAttribDC, lpszString, nCount, &size));

我百度下,发现有一个帖子和我类似
http://bbs.csdn.net/topics/270071437

大概原因是”工作线程调用添加点的函数AddPoint(),AddPoint()返回前都要调用CWnd::Invalidate()让ChartCtrl客户区无效,并产生一条WM_PAINT消息到窗口的消息队列中,未等WM_PAINT消息处理之前,Invalid()就返回了,未重画前,应该客户区的CDC对象也可能无效。
但如果工作线程在此时来刷新窗口时,使用到的CChartCtrl的客户区的CDC对象可能无效(在调用了Invalidate()之后、WM_PAINT消息处理之前),所以导致了GetTextPoint32()函数失败“
但是这个问题怎么解决呢,画图的时候禁止主界面刷新么,或者主界面绘图的时候禁止画曲线图么
...全文
614 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lishi_1991 2018-01-22
  • 打赏
  • 举报
回复
引用 3 楼 zgl7903 的回复:
试试 添加数据之前锁定刷新, 添加完解除锁定 pCtrl->LockWindowUpdate(); pCtrl->XXXXXXXX pCtrl->UnlockWindowUpdate(); pCtrl->Refresh
非常感谢你的回复,我试试看,现在我是人为把刷新速度降下来了
csulizhang 2018-01-19
  • 打赏
  • 举报
回复
多线程做MFC的窗体控制是很麻烦的,容易出现不可估计的错误,我目前采用的方法是用std::condition_variable::notify_one()+std::mutex的线程等待机制,避免频繁、重复的消息造成控对象的产生
zgl7903 2018-01-19
  • 打赏
  • 举报
回复
试试 添加数据之前锁定刷新, 添加完解除锁定 pCtrl->LockWindowUpdate(); pCtrl->XXXXXXXX pCtrl->UnlockWindowUpdate(); pCtrl->Refresh
red-fly 2018-01-18
  • 打赏
  • 举报
回复
在线程中操作界面是比较麻烦的事儿。 pLineSerie1->ClearSerie(); pLineSerie1->AddPoints(x, dYValue,DATA_COUNT); 这两行代码是在线程中调用的吗? 是否可以改用一个按钮来测试一下?在按钮的事件中调用它,看是否会出现错误。 对于控件自动刷新,实际上是否仍然是你的代码在运行?还是完全由控件根据提供的点来画线?如果完全是控件自己画的,那应该是控件自己的问题,可以考虑换个版本试试
赵4老师 2018-01-17
  • 打赏
  • 举报
回复
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧