查看: 2045|回复: 8

osg与MFC结合动态添加对象的问题

[复制链接]

该用户从未签到

发表于 2012-12-23 13:43:57 | 显示全部楼层 |阅读模式
参考osg中自带的examples\osgviewerMFC中osg与mfc结合的实例,在视图类中想动态添加对象,如点击菜单响应添加:
int CdynamicMFCView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
        if (CView::OnCreate(lpCreateStruct) == -1)
                return -1;

        // TODO:  在此添加您专用的创建代码
        mOSG = new cOSG(m_hWnd);
        return 0;
}

void CdynamicMFCView::OnInitialUpdate()
{
        CView::OnInitialUpdate();

        // TODO: 在此添加专用代码和/或调用基类
        mOSG->InitOSG("cow.osg");
        mThreadHandle = (HANDLE)_beginthread(&cOSG::Render,0,mOSG);
}
//点击菜单响应
void CdynamicMFCView::OnAdd()
{
        // TODO: 在此添加命令处理程序代码
        osg::ref_ptr<osg::MatrixTransform>mt= new osg::MatrixTransform;
        mt->setMatrix(osg::Matrix::translate(osg::Vec3(n,0,0)));
        mt->addChild(osgDB::readNodeFile("glider.osg"));
        n++;
        mOSG->mRoot->addChild(mt.get());
}
对它进行多次测试发现,在添加过程中会出现运行中断:Expression"this->_Has_container()",0),有时候添加了上百个对象仍然没有中断,运行良好,这是怎么个情况?大家帮帮忙,这个问题都弄的我寝食难安了:(

该用户从未签到

发表于 2012-12-23 16:50:01 | 显示全部楼层
加个线程锁就好了。

该用户从未签到

 楼主| 发表于 2012-12-23 20:30:45 | 显示全部楼层
smash 发表于 2012-12-23 16:50
加个线程锁就好了。

你好,能看到回复真是太激动了,能说详细点就更感激了,怎样加线程锁?加在什么地方?或者能不能给个程序实例?谢谢

该用户从未签到

发表于 2012-12-23 20:54:56 | 显示全部楼层
smengq 发表于 2012-12-23 20:30
你好,能看到回复真是太激动了,能说详细点就更感激了,怎样加线程锁?加在什么地方?或者能不能给个程序 ...

最主要的是在readNodeFile的时候加上线程锁,两个线程同时读取模型的话,出错的概率非常大。
另外在读完模型挂载到场景下的时候理论上也要加锁,但是一般不加似乎也不会出错。

该用户从未签到

 楼主| 发表于 2012-12-23 21:18:46 | 显示全部楼层
smash 发表于 2012-12-23 20:54
最主要的是在readNodeFile的时候加上线程锁,两个线程同时读取模型的话,出错的概率非常大。
另外在读完 ...

我这里要是不读取文件NodeFile,只是添加一个物体节点,比如球:
void CdynamicMFCView::OnAdd()
{
        // TODO: 在此添加命令处理程序代码
        osg::ref_ptr<osg::MatrixTransform>mt= new osg::MatrixTransform;
        mt->setMatrix(osg::Matrix::translate(osg::Vec3(n,0,0)));
        osg::ref_ptr<osg::Geode> geode = new osg::Geode;
        osg::ref_ptr<osg::Sphere> sphere = new osg::Sphere(osg::Vec3(0,0,0),0.5);
        osg::ref_ptr<osg::ShapeDrawable> shape = new osg::ShapeDrawable(sphere.get());
        shape->setColor(osg::Vec4(1,0,0,1.0));
        geode->addDrawable(shape.get());
        mt->addChild(geode.get());
        n++;
        mOSG->mRoot->addChild(mt.get());
}
也是同样的问题,这里也需要枷锁?

该用户从未签到

发表于 2012-12-24 00:34:53 | 显示全部楼层
本帖最后由 smash 于 2012-12-24 00:35 编辑
smengq 发表于 2012-12-23 21:18
我这里要是不读取文件NodeFile,只是添加一个物体节点,比如球:
void CdynamicMFCView::OnAdd()
{


我觉得只要在
        n++;
        mOSG->mRoot->addChild(mt.get());
加锁就可以了,不过你也可以试试看全部锁上的情况。

该用户从未签到

发表于 2012-12-24 08:01:25 | 显示全部楼层
执行最后那句addChild的时候 锁住osg主线程就行了 读取的时候不用

该用户从未签到

 楼主| 发表于 2012-12-24 08:47:36 | 显示全部楼层
liuzhiyu123 发表于 2012-12-24 08:01
执行最后那句addChild的时候 锁住osg主线程就行了 读取的时候不用

具体的加锁语句怎么写?

该用户从未签到

发表于 2012-12-24 08:50:31 | 显示全部楼层
OpenThreads::ScopeLock<OpenTHreads::Mutex> lock(_mutex);
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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