查看: 2507|回复: 15

访问冲突问题,有没有哪位大神遇到过相似的问题,谢谢了

[复制链接]

该用户从未签到

发表于 2013-3-10 15:32:36 | 显示全部楼层 |阅读模式
调用堆栈:
>        osg65-osgd.dll!osg::NodeCallback::traverse(osg::Node * node=0x02390850, osg::NodeVisitor * nv=0x0242a1f8)  行21 + 0x2d 字节        C++
        HardDiskS.exe!CAL_ModelPan:perator()(osg::Node * node=0x02390850, osg::NodeVisitor * nv=0x0242a1f8)  行29 + 0x13 字节        C++
        osg65-osgUtild.dll!osgUtil::UpdateVisitor::handle_callbacks_and_traverse(osg::Node & node={...})  行85 + 0x1c 字节        C++
        osg65-osgUtild.dll!osgUtil::UpdateVisitor::apply(osg::Transform & node={...})  行57 + 0x1a 字节        C++
        osg65-osgd.dll!osg::NodeVisitor::apply(osg::MatrixTransform & node={...})  行136 + 0x13 字节        C++
        osg65-osgd.dll!osg::MatrixTransform::accept(osg::NodeVisitor & nv={...})  行37 + 0x41 字节        C++
输出:
G:\OSG\OpenSceneGraph-2.8.4\bin\bin\osg65-osgSimd.dll”,已加载符号。
“HardDiskS.exe”: 已加载“G:\OSG\OpenSceneGraph-2.8.4\bin\bin\osg65-osgFXd.dll”,已加载符号。
“HardDiskS.exe”: 已加载“G:\OSG\OpenSceneGraph-2.8.4\bin\bin\osg65-osgTerraind.dll”,已加载符号。
“HardDiskS.exe”: 已加载“C:\Windows\System32\zlibd1.dll”
HardDiskS.exe 中的 0x0f69e235 (osg65-osgd.dll) 处最可能的异常: 0xC0000005: 读取位置 0xfeeefeee 时发生访问冲突
HardDiskS.exe 中的 0x0f69e235 (osg65-osgd.dll) 处未处理的异常: 0xC0000005: 读取位置 0xfeeefeee 时发生访问冲突

实在找不错错在哪,求指教。


该用户从未签到

发表于 2013-3-10 15:35:37 | 显示全部楼层
嗯???请问您解决这个问题啦?最近我也遇到这个问题  一直不知道那里的问题   如果您解决了啊,麻烦告诉我一下啊  谢啦

该用户从未签到

发表于 2013-3-11 09:39:19 | 显示全部楼层
HardDiskS.exe!CAL_ModelPan:perator()(osg::Node * node=0x02390850, osg::NodeVisitor * nv=0x0242a1f8)  行29 + 0x13 字节
很显然这里就是您应该去排查的地方

该用户从未签到

 楼主| 发表于 2013-3-11 19:54:51 | 显示全部楼层
array 发表于 2013-3-11 09:39
很显然这里就是您应该去排查的地方

我的回调函数是这样实现的,是否有错误

void CAL_ModelPan:perator()(osg::Node *node,osg::NodeVisitor *nv)
{
        osg::Matrix mr;
        if (isPan != 0)
        {
                CurrentPos += SpeedAxis;       //计算模型在三维空间的下一个位置坐标
                mr.makeTranslate(CurrentPos);    //设定模型的位置坐标
                mt->setMatrix(mt1*mRotateX*mRotateY*mRotateZ*mt2*mr);

                traverse(node,nv); //跟踪调试到此处
        }
        else return;
}       
       //int isPan;             //保存模型运动标志。0——不运动;1——运动
       //osg::Vec3 SpeedAxis;      //保存模型沿着哪个坐标轴移动,以及移动的速度(向量PanAxis的三维分量表示沿该坐标轴移            //动的速度)
        //osg::Vec3 CurrentPos;   //保存模型的当前坐标位置
        //osg::Matrix mRotateX,mRotateY,mRotateZ;
        //osg::Matrix mt1, mt2;
       // osg::ref_ptr<osg::MatrixTransform> mt = dynamic_cast<osg::MatrixTransform*>(node);

每次跟踪调试,都定位在traverse(node,nv);这一句上

该用户从未签到

 楼主| 发表于 2013-3-11 19:58:04 | 显示全部楼层
array 发表于 2013-3-11 09:39
很显然这里就是您应该去排查的地方

实在不知从何处排查。请您指点一二。谢谢!

该用户从未签到

发表于 2013-3-11 20:24:47 | 显示全部楼层
好久不写代码了,感觉应该把traverse放在if的外面~~

该用户从未签到

 楼主| 发表于 2013-3-11 20:28:47 | 显示全部楼层
Gooogle 发表于 2013-3-11 20:24
好久不写代码了,感觉应该把traverse放在if的外面~~

谢谢。试过了,还是会出错的。

该用户从未签到

发表于 2013-3-12 07:54:22 | 显示全部楼层
mt 判断类型是否正确

该用户从未签到

 楼主| 发表于 2013-3-12 12:53:38 | 显示全部楼层
liuzhiyu123 发表于 2013-3-12 07:54
mt 判断类型是否正确

不好意思,应该是这样:
void CAL_ModelPan:perator()(osg::Node *node,osg::NodeVisitor *nv)
{
          osg::ref_ptr<osg::MatrixTransform> mt = dynamic_cast<osg::MatrixTransform*>(node);
         osg::Matrix mr;
        if (isPan != 0)
        {
                CurrentPos += SpeedAxis;       //计算模型在三维空间的下一个位置坐标
                mr.makeTranslate(CurrentPos);    //设定模型的位置坐标
                mt->setMatrix(mt1*mRotateX*mRotateY*mRotateZ*mt2*mr);

                traverse(node,nv); //跟踪调试到此处
        }
        else return;
}        
       //int isPan;             //保存模型运动标志。0——不运动;1——运动
       //osg::Vec3 SpeedAxis;      //保存模型沿着哪个坐标轴移动,以及移动的速度(向量PanAxis的三维分量表示沿该坐标轴移            //动的速度)
        //osg::Vec3 CurrentPos;   //保存模型的当前坐标位置
        //osg::Matrix mRotateX,mRotateY,mRotateZ;
        //osg::Matrix mt1, mt2;

该用户从未签到

发表于 2013-3-13 12:19:59 | 显示全部楼层
检查mt的类型是否有效

该用户从未签到

 楼主| 发表于 2013-3-13 17:55:49 | 显示全部楼层
liuzhiyu123 发表于 2013-3-13 12:19
检查mt的类型是否有效

能否清楚点,怎样检查mt类型?谢谢。

该用户从未签到

发表于 2013-3-14 07:53:41 | 显示全部楼层
  osg::ref_ptr<osg::MatrixTransform> mt = dynamic_cast<osg::MatrixTransform*>(node);
if(mt.valid())
{

}

该用户从未签到

 楼主| 发表于 2013-3-14 16:03:35 | 显示全部楼层
liuzhiyu123 发表于 2013-3-14 07:53
osg::ref_ptr mt = dynamic_cast(node);
if(mt.valid())
{

嘿嘿……谢谢!这样还是不行
if(mt.valid())
        {
                if (isPan != 0)
                {
                        CurrentPos += SpeedAxis;       //计算模型在三维空间的下一个位置坐标
                        mr.makeTranslate(CurrentPos);    //设定模型的位置坐标
                        mt->setMatrix(mt1*mRotateX*mRotateY*mRotateZ*mt2*mr);
                }
                traverse(node,nv);//这句放外面放里面都会错,调试时也是跟踪到这
        }

不明白

该用户从未签到

 楼主| 发表于 2013-3-14 16:04:48 | 显示全部楼层
huaihuai 发表于 2013-3-14 16:03
嘿嘿……谢谢!这样还是不行
if(mt.valid())
        {

不好意思哦,我这有点像打破砂锅问到底了,谢谢您的耐心回答。

该用户从未签到

发表于 2013-3-14 16:23:12 | 显示全部楼层
类型检测,判断是否为空,更新不与渲染冲突,基本就是这些了

该用户从未签到

 楼主| 发表于 2013-3-15 19:01:00 | 显示全部楼层
liuzhiyu123 发表于 2013-3-14 16:23
类型检测,判断是否为空,更新不与渲染冲突,基本就是这些了

谢谢。我按这几个方向再排查排查。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表