查看: 2859|回复: 10

osg 中的多线程问题

[复制链接]

该用户从未签到

发表于 2009-4-30 10:40:02 | 显示全部楼层 |阅读模式
请问版主,我在osgviewMFC的例子中想利用多线程实现上百个数据文件的动态调度,自己写了个继承于openthread::thread的类重载了,其中的run(),在run()中实现数据的调度,但发现运行后没有达到效果,在加载数据的过程中,鼠标键盘都不响应了!这是为什么啊?是自己用的不对,还是少了什么步骤啊?请版竹赐教啊!

该用户从未签到

发表于 2009-4-30 11:40:25 | 显示全部楼层
您最好提供一些可以说明问题的代码,不然凭空是很难判断您的问题所在的

该用户从未签到

 楼主| 发表于 2009-4-30 15:51:45 | 显示全部楼层
好的,代码写的比较差,见笑了,麻烦版主耐心给看看。

Class CMyThread:public OpenThreads::Thread
{
public:
     CMyThread (void);
          ~CMyThread (void);
          virtual  int  Cancel();
     virtual   void run();
    void run()
  {
    ReadData();
  }
}


ReadData()
{   osg::proxyNode * m_pn =new  osg::proxyNode ;
   while(1)
  { sleep(200);
    m_pn ->SetDataVaricance(...);
        m_pn ->SetDataPath("...");
        m_pn ->SetFileName(0,"xxx.osg");
       SenceRoot->addchild(m_pn );
    }
}



在View中的键盘响应中加入如下代码:
CMyThread *mythread = new CMyThread ;
CMyThread ::Init();
mythread ->run();


自己是按照VP中的相关多线程代码,改写的,但发现程序老是在执行while(1)的循环,且出现程序不响应,但在vp中这样就行,自己对OSG中的多线程机制尤其是多线程数据调度不是很明白,对OpenThreads::Thread的用法更是不熟悉,请版主赐教。

该用户从未签到

发表于 2009-4-30 16:17:07 | 显示全部楼层
别的我没有细看,不过显然您的线程独占了所有的CPU时间,导致死锁。sleep从来都不是线程相关的函数,正确的用法是OpenThreads::Thread::microSleep

OSG没有什么特殊的机制,完全符合POSIX线程编程标准。OpenThreads的用法则在源代码中颇多体现,我在编写动态GIF插件的时候就是用了Thread类来实现的,请参看ReaderWriterGIF.cpp的内容

该用户从未签到

发表于 2009-4-30 16:52:54 | 显示全部楼层
好的,谢谢版主了,我去看看ReaderWriterGIF.cpp。万分感谢!

该用户从未签到

发表于 2009-4-30 17:01:55 | 显示全部楼层
dzm520和hanxiaohuivc是一个人?

该用户从未签到

发表于 2009-4-30 17:08:04 | 显示全部楼层
呵呵……不是,是别人用我的账号了,不好意思啊!

该用户从未签到

 楼主| 发表于 2009-5-3 14:48:53 | 显示全部楼层
版主,ReaderWriterGIF.cpp中没有OpenThreads的用法啊!自己找了好多源码也没找到,麻烦版主再给查查,谢谢了,对了版主,如果我不用多线程,而用回调去实现数据随视点的不同而采用不同的调度策略,这样是不是也行啊?

该用户从未签到

发表于 2009-5-3 18:29:22 | 显示全部楼层
怎么会没有?GifImageStream这个类是如何继承和实现的,真的麻烦您再好好看一看。“自己找了好多源码也没找到”,抱歉我不认为您真的查过好多代码了,OSG源代码中有关Threads的应用俯拾皆是……

我不认为回调是一个好的做法,它只是向开发者提供一种临时的解决方案,我个人认为继承Node类编写自定义功能的节点是一种灵活的方式

该用户从未签到

发表于 2009-5-4 14:28:56 | 显示全部楼层
<
在View中的键盘响应中加入如下代码:
CMyThread *mythread = new CMyThread ;
CMyThread ::Init();
mythread ->run();
>
由此来看你是在响应消息的线程中执行的读取操作,而没有使用单独的线程
应该使用Thread::start而不是直接调用run启动线程

该用户从未签到

 楼主| 发表于 2009-5-4 14:45:23 | 显示全部楼层
好的,谢谢大家了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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