查看: 1450|回复: 4

qt4下多文档应用程序的共享内存问题!

[复制链接]

该用户从未签到

发表于 2011-4-20 13:21:37 | 显示全部楼层 |阅读模式
本帖最后由 口口广大 于 2011-4-20 13:23 编辑

与人合作在linux下用qt开发一个多文档的应用程序,osg作为一个子文档加载到qt4的主窗口中。用的是osg2.9.6下的ViewerQT 类(好像就是王锐老师写的 )。


问题来了,加入osg应用程序后会影响到其他文档所使用的共享内存。表现为,一台加入osg的应用程序的报文收发程序会报警报文长度异常,另一台未加osg的则一切正常。一点点的找原因,直到仅初始化一个ViewerQT 对象,对象中除了frame()不做任何操作,仍然会出现上述问题。把frame()封掉,或者干脆不加入ViewerQT对象,则变得正常。

现象就是这么简单和诡异,虽然错误是在别人的程序里的报的,但明显是加入osg后才引起了程序异常,虽然osg这时仅仅只是空转仿真循环,这为今后调试程序带来了极大的不变。以前在MFC下开发似乎没有这样的问题,这个问题超出了我对osg的掌握,问题是不是出在osg版本,qt版本,或者多文档上面?求教,谢谢!


  1. class ViewerQT : public osgViewer::Viewer, public AdapterWidget
  2. {
  3.     public:
  4.         ViewerQT(QWidget * parent = 0, const char * name = 0, const QGLWidget * shareWidget = 0, WindowFlags f = 0):
  5.             AdapterWidget( parent, name, shareWidget, f )
  6.         {
  7.             connect(&_timer, SIGNAL(timeout()), this, SLOT(updateGL()));
  8.             _timer.start(16);
  9.         }
  10.         virtual void paintGL()
  11.         {
  12.             frame();
  13.         }
  14.     protected:
  15.         QTimer _timer;
  16. };

复制代码

该用户从未签到

发表于 2011-4-21 08:43:28 | 显示全部楼层
我认为这两者没什么关系,我的程序中恰好也用到了共享内存,没有发现过什么冲突问题

该用户从未签到

 楼主| 发表于 2011-4-21 22:50:16 | 显示全部楼层
本帖最后由 口口广大 于 2011-4-22 00:27 编辑
  1. class CompositeViewerQT : public osgViewer::CompositeViewer, public AdapterWidget
  2. {
  3. public:

  4. CompositeViewerQT(QWidget * parent = 0, const char * name = 0, const QGLWidget * shareWidget = 0, WindowFlags f = 0):
  5. AdapterWidget( parent, name, shareWidget, f )
  6. {
  7. setThreadingModel(osgViewer::CompositeViewer::SingleThreaded);

  8. setCameraManipulator(new osgGA::TrackballManipulator);

  9. osg::Node* loadedModel= osgDB::readNodeFile("地形.osga");   //报错

  10. osg::Node* loadedModel= osgDB::readNodeFile("cow.ive");   //没错

  11. setSceneData(loadedModel.get());

  12. connect(&_timer, SIGNAL(timeout()), this, SLOT(updateGL()));
  13. _timer.start(10);
  14. }

  15. virtual void paintGL()
  16. {
  17. frame();
  18. }

  19. protected:

  20. QTimer _timer;
  21. };
复制代码


今天查了一天,问题定位在vpb生成的地形数据上。
所有的操作不做,只是加载了一个vpb生成的osga格式的地形文件,就会破坏共享区,把这个node换成普通的其他三维模型,则不会出现错误。

怀疑是否vpb使用的动态分页(PageLoad)动态的加载或释放内存,导致了进程的内存共享区受到破坏?

另外我使用的vpb是比较老的版本,而且不是用现在开发的osg2.9.6版本进行编译。

该用户从未签到

发表于 2011-4-22 09:39:20 | 显示全部楼层
osg-users上Robert分析了您的问题,应该不会处在这里

该用户从未签到

 楼主| 发表于 2011-5-3 15:33:01 | 显示全部楼层
解决了,是在qt里开的时控没有屏蔽线程间信号的问题。大概是这样,因为我只是把这个现象告诉了专门负责写进程间通讯程序的同事,他一个晚上就解决了。这件事充分说明了合作的重要性,谢谢个位!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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