查看: 3191|回复: 2

新开一个线程根据视点位置加载相应的模型,但是读取模型后有问题,如下图

[复制链接]

该用户从未签到

发表于 2017-5-14 16:04:45 | 显示全部楼层 |阅读模式
代码如下:
int main()
{
        osg::ref_ptr<osg::Group>root = new osg::Group;
        osg::ref_ptr <osg::Node>spaceship = osgDB::readNodeFile("spaceship.osgt");
        osg::ref_ptr <osgViewer::Viewer>viewer = new osgViewer::Viewer;

        root->setDataVariance(osg::Object:YNAMIC);
       
        viewer->addEventHandler(new osgViewer::StatsHandler);
       
        root->addChild(spaceship.get());


        viewer->setSceneData(root.get());
        viewer->setCameraManipulator(new CSouth());
        hMutex = CreateMutex(NULL, FALSE, NULL);

        while (viewer)
        {
                HANDLE hThread1;
                hThread1 = CreateThread(NULL, 0, Function, NULL, 0, NULL);
                CloseHandle(hThread1);
       
                viewer->run();
                Sleep(2000);
               
        }


}


DWORD WINAPI Function(LPVOID lpParameter)
{
       

                string sql;
                CADO record;
                _RecordsetPtr m_pRecordset;
                sql = "select * from navigation";
                _bstr_t bstr_t(sql.c_str());
                m_pRecordset = record.GetRecordset(bstr_t);
                while (1)
                {
                        WaitForSingleObject(hMutex, INFINITE);
                        while (!m_pRecordset->rsEOF)
                        {

                                float x = m_pRecordset->GetCollect("position_x");
                                float y = m_pRecordset->GetCollect("position_y");
                                float dis = sqrt((eyepos.x() - x)*(eyepos.x() - x) + (eyepos.y() - y)*(eyepos.y() - y));
                               
                                if (dis < 300)
                                {
                                        CStringW cs;
                                        _variant_t va = m_pRecordset->GetCollect("nodename");
                                        cs = va.bstrVal;
                                        CStringA stra(cs.GetBuffer(0));
                                        nodename = stra.GetBuffer(0);
                                        stra.ReleaseBuffer();

                                        std::cout << nodename << endl;
                                        osg::ref_ptr <osg::Node>node = osgDB::readNodeFile(nodename);
                                        if (node)
                                        {
                                                        root->addChild(node.get());       
                                               
                                        }
                                       
                                }

                                m_pRecordset->MoveNext();

                        }

                        ReleaseMutex(hMutex);
                }
                record.ExitConnect();
       
               
        return 0;

}
用新开的线程读取SQL SERVER数据库,模型的信息保存在数据库中,能够读取并将模型加入到场景中,但是立即就出现了上述错误,不知道是哪里出了问题,这个问题已经折磨我三四天了,希望高人看到后能够指点一二,不胜感激!
问题.png
光标位置.png

该用户从未签到

发表于 2017-5-19 13:52:33 | 显示全部楼层
渲染线程正在遍历group的子节点,你的线程在给group加子节点,两个线程对这个group的子节点同步的问题

该用户从未签到

 楼主| 发表于 2017-5-20 16:25:12 | 显示全部楼层
rpgpp 发表于 2017-5-19 13:52
渲染线程正在遍历group的子节点,你的线程在给group加子节点,两个线程对这个group的子节点同步的问题

好的,谢谢回答,我再改下试试看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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