查看: 2250|回复: 5

还是关于MFC线程的问题

[复制链接]

该用户从未签到

发表于 2011-12-2 00:18:31 | 显示全部楼层 |阅读模式
最近为了尝试MFC主线程内修改OSG数据的方法,但都不是很理想,程序的结构接口设计不怎么方便,且不容易结构组件化。无奈之下,在程序主线程需要修改数据的情况下,设置全局变量让frame()的循环停下来,等数据更新完毕之后线程继续开始工作。这种方法尝试了一段时间之后似乎没碰到什么问题,但是今天终于碰上问题了:

就是在停止osg帧循环后在主线程中添加widget窗口组件时,由其它动态库创建的widget对象加入到WindowManager后,程序运行半分钟到一分钟百分之百崩溃;如果是在同一模块创建的widget倒是暂时还没发现什么问题。于是我对停止帧循环更新数据这种懒人的方式的可靠产生了严重怀疑。由于实验不怎么充分,不知道还有没有什么其它的问题。

该用户从未签到

发表于 2011-12-2 09:21:41 | 显示全部楼层
  停止帧更新数据的方式, 我没试过,不知道什么情况,请给出错误截图。
  更新osg的数据,可以通过更新回调,简单的,你通过布尔变量在主线程里触发更新回调的条件就好了,或者其他更优雅的方式。
你在主线程添加widget和osg渲染线程有什么关系呢?影响了原来的view的大小,还是怎么了?建议取消osg渲染,看看是你的mfc编程的用法是否有误。

该用户从未签到

 楼主| 发表于 2011-12-2 10:17:36 | 显示全部楼层
CWorld 发表于 2011-12-2 09:21
停止帧更新数据的方式, 我没试过,不知道什么情况,请给出错误截图。
  更新osg的数据,可以通过更新回 ...

我的想法是代码本身并没有错误,因为在同一个模块下面相同的代码创建的widget加入到windowmgr下面可以很好运行,出错的情况目前看来只是在其它模块(dll)创建的widget由主线程加入到windowsmgr里面,运行一分钟左右的时候出错。但是其它模块里创建的widget通过event触发更新加入场景后也能很好的运行。  我猜测可能是一些回调函数在不同模块内线程混乱的原因,对于这方面没什么研究,只能继续通过代码试验一下了。

出错的地方基本上都是cull_draw里面vector访问内存错误。

该用户从未签到

 楼主| 发表于 2011-12-2 11:23:39 | 显示全部楼层
不光是widget,我刚试了一下其他模块下创建一般的geode节点,同样的崩溃,我原来都是在同一个模块下创建的,所以还没发现。

该用户从未签到

发表于 2011-12-5 09:41:33 | 显示全部楼层
最近为了尝试MFC主线程内修改OSG数据的方法,但都不是很理想
我很无奈地是,您为什么要这么做?如果想要用到OSG的多线程特性,那您没的选择,只能使用command buffer这样的策略。否则请直接在SingleThreaded下启动

该用户从未签到

发表于 2011-12-6 19:36:15 | 显示全部楼层
没这么麻烦吧,我以前搞得很简单啊,在主线程中利用cOSG对象调用相关的修改数据不就行了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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