使用CDC:GetTextExtent出现了有关问题的奇怪有关问题,m_hDC 是有效的,但GetTextExtent内部调用GetExtentPoint32有时失败
使用CDC::GetTextExtent出现了问题的奇怪问题,m_hDC 是有效的,但GetTextExtent内部调用GetExtentPoint32有时失败
本人写了一个程序,使用了一个开源的ChartCtrl(http://www.codeproject.com/KB/miscctrl/High-speedCharting.aspx),控件在刷新时要使用GetTextExtent来获取控件上字符串的尺寸。
在界面视图A上放置CChartCtrl控件,一个工作线程去定时取数据,然后调用界面视图A的方法将数据数据在CChartCtrl控件上界面出来,程序在运行的时候有时出现f:\rtm\vctools\vc7libs\ship\atlmfc\include\afxwin1.inl,即GetTextExtent内部调用GetExtentPoint32()返回FALSE导致VERIFY失败而弹出的对话框,如果DEBUG模时,忽略掉该问题了,程序又可以正常运行了,但过一段时间又出这样的问题。
仔细分析了CChartCtrl的代码,m_hDC绝对是有效的,而且在运行过程中没有改过CDC对象。并且不存在多线程访问界面视图A。
出现问题后调用GetLastError()都返回0,即正常。
好奇怪的问题了,搞了一周了还没有找到解决方案,先谢谢各位的帮助了。
------解决方案--------------------
m_hAttribDC必须是有效的
------解决方案--------------------
在界面视图A上放置CChartCtrl控件,一个工作线程去定时取数据,然后调用界面视图A的方法将数据数据在CChartCtrl控件上界面出来,程序在运行的时候有时出现f:\rtm\vctools\vc7libs\ship\atlmfc\include\afxwin1.inl,即GetTextExtent内部调用GetExtentPoint32()返回FALSE导致VERIFY失败而弹出的对话框,如果DEBUG模时,忽略掉该问题了,程序又可以正常运行了,但过一段时间又出这样的问题。
仔细分析了CChartCtrl的代码,m_hDC绝对是有效的,而且在运行过程中没有改过CDC对象。并且不存在多线程访问界面视图A。
明显是多线程引起的问题,怎么还说不存在 多线程访问界面视图A
应该工作线程取得数据后,发消息告诉视图A,A读数据刷新CChartCtrl控件
------解决方案--------------------
MFC很多类和方法都是非线程安全的.
------解决方案--------------------
在界面视图A上放置CChartCtrl控件,一个工作线程去定时取数据,然后调用界面视图A的方法将数据数据在CChartCtrl控件上界面出来...
---------------------
你线程中将数据数据在CChartCtrl控件上显示出来,会调用GetDC,但是别忘了界面也是会刷新的,也需要调用GetDC,这就是两个线程在抢DC,当然可能会失效了。
本人写了一个程序,使用了一个开源的ChartCtrl(http://www.codeproject.com/KB/miscctrl/High-speedCharting.aspx),控件在刷新时要使用GetTextExtent来获取控件上字符串的尺寸。
在界面视图A上放置CChartCtrl控件,一个工作线程去定时取数据,然后调用界面视图A的方法将数据数据在CChartCtrl控件上界面出来,程序在运行的时候有时出现f:\rtm\vctools\vc7libs\ship\atlmfc\include\afxwin1.inl,即GetTextExtent内部调用GetExtentPoint32()返回FALSE导致VERIFY失败而弹出的对话框,如果DEBUG模时,忽略掉该问题了,程序又可以正常运行了,但过一段时间又出这样的问题。
仔细分析了CChartCtrl的代码,m_hDC绝对是有效的,而且在运行过程中没有改过CDC对象。并且不存在多线程访问界面视图A。
出现问题后调用GetLastError()都返回0,即正常。
好奇怪的问题了,搞了一周了还没有找到解决方案,先谢谢各位的帮助了。
------解决方案--------------------
m_hAttribDC必须是有效的
------解决方案--------------------
在界面视图A上放置CChartCtrl控件,一个工作线程去定时取数据,然后调用界面视图A的方法将数据数据在CChartCtrl控件上界面出来,程序在运行的时候有时出现f:\rtm\vctools\vc7libs\ship\atlmfc\include\afxwin1.inl,即GetTextExtent内部调用GetExtentPoint32()返回FALSE导致VERIFY失败而弹出的对话框,如果DEBUG模时,忽略掉该问题了,程序又可以正常运行了,但过一段时间又出这样的问题。
仔细分析了CChartCtrl的代码,m_hDC绝对是有效的,而且在运行过程中没有改过CDC对象。并且不存在多线程访问界面视图A。
明显是多线程引起的问题,怎么还说不存在 多线程访问界面视图A
应该工作线程取得数据后,发消息告诉视图A,A读数据刷新CChartCtrl控件
------解决方案--------------------
MFC很多类和方法都是非线程安全的.
------解决方案--------------------
在界面视图A上放置CChartCtrl控件,一个工作线程去定时取数据,然后调用界面视图A的方法将数据数据在CChartCtrl控件上界面出来...
---------------------
你线程中将数据数据在CChartCtrl控件上显示出来,会调用GetDC,但是别忘了界面也是会刷新的,也需要调用GetDC,这就是两个线程在抢DC,当然可能会失效了。