查看: 3949|回复: 6

求助 如何某个删除事件响应?

[复制链接]

该用户从未签到

发表于 2009-6-11 20:26:00 | 显示全部楼层 |阅读模式
我用viewer->addEventHandler()添加了一个事件响应 后面不用了 用下面的代码把它删除掉:
不知道哪里有问题 运行时都会挂掉 弹出错误显示:“List Iterator Not Incrementable” 不知什么原因 请高手指点一下
  1. for (osgViewer::View::EventHandlers::iterator iter = _viewer->getEventHandlers().begin();iter != _viewer->getEventHandlers().end();)
  2.                 {
  3.                         if(*iter == _pick)
  4.                         {
  5.                                 iter = _viewer->getEventHandlers().erase(iter);
  6.                         }
  7.                         else
  8.                         {
  9.                                 ++iter;
  10.                         }
  11.                 }
复制代码

该用户从未签到

发表于 2009-6-11 21:29:56 | 显示全部楼层
您的这段代码中似乎看不出有什么错误,也许错误出在别的地方。尤其是这段代码放置的地方如果不当的话,会与场景的更新操作出现冲突

该用户从未签到

 楼主| 发表于 2009-6-12 10:26:53 | 显示全部楼层
谢谢array。
确实是和位置有关,我把代码换到另外的地方就不会死了,但还是不明白具体的原因是什么,array可以详细说一下吗?使用这段代码的时候应该注意什么?

该用户从未签到

发表于 2009-6-12 13:44:44 | 显示全部楼层
呃,我不太可能知道您这段代码的应用场合。osg中最需要注意的是场景中对象的修改和删减,为了避免与渲染线程的冲突,一般都会设置要修改的对象为DYNAMIC

该用户从未签到

 楼主| 发表于 2009-6-12 17:11:40 | 显示全部楼层
谢谢array的回答。
我把事件响应的属性改为DYNAMIC后,代码放到以前的位置还是会死,我以为DYNAMIC是万能的,看来不是,呵呵。
我的程序是这样的,麻烦array帮忙分析一下:
  1.          //新建一个pickhandler
  2.          _pick = new PickHandler();
  3.         //设置为DYNAMIC
  4.         _pick->setDataVariance(osg::Object::DataVariance::DYNAMIC);
  5.        // 加入到viewer中
  6.         _viewer->addEventHandler(_pick);
复制代码
~~~~~~~~~
      拾取到场景中节点后弹出一个模式对话框。

      我是在对话框关闭的时候调用了删除事件响应的代码,然后崩溃....

该用户从未签到

发表于 2009-6-12 19:13:01 | 显示全部楼层
DYNAMIC确实不会影响到事件处理器,它只影响渲染队列中的对象的行为。删除的动作最好在更新回调中完成

该用户从未签到

 楼主| 发表于 2009-6-13 14:04:31 | 显示全部楼层
哦 继续学习~~~~谢谢array!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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