我要发帖 回复

中级会员

3

主题

111

积分

0

专家分

兴趣点(最多三项):

视景仿真

私信
发表时间 : 2014-1-8 08:39:32 | 浏览 : 1512    评论 : 7
各位大神,我在vp2.2+vc2005,平台下创建基于线程的运行模式,在控制线程退出时,vp::shutdown()处报错,如果强制退出,导致无法再次创建线程,除非整个进程退出。
我的线程部分代码如下:
UINT VpAnalyseThread( LPVOID pParam )
{
   CRecordAnalyseDlg*pOwner=(CRecordAnalyseDlg*)pParam;
///////////////////////////////////////////////////////////
   int result; // vsgu::SUCCESSor vsgu::FAILURE   
   //初始化
   result=vp::initialize(__argc, __argv);
   assert(result==vsgu::SUCCESS);
   result=vsgu::initialize(__argc, __argv);
   assert(result==vsgu::SUCCESS);
   //vpinit
   pOwner->postInit();
   pOwner->m_VpInited=true;
///////////////////////////////////////////////////////////
   //vpdefine 加载acf文件定义场景
   result=vpKernel::instance()->define("../Bin/analyse.acf");
   assert(result==vsgu::SUCCESS);
   //pOwner->setSearchPath();
   pOwner->m_VpDefined=true;
   //vpconfig 配置场景
   result = vpKernel::instance()->configure();
   assert(result==vsgu::SUCCESS);
   //vp加载三维对象模型
   pOwner->postConfig();
   pOwner->m_VpConfiged=true;
   //
   vpAnalyseThreadStatus=true;
   vpKernel* myKernel=vpKernel::find("myKernel");
   assert(myKernel);
   while (vpAnalyseThreadStatus)
   {
      pOwner->m_VpFrameNum=myKernel->beginFrame();
      //
      pOwner->postSync();
      pOwner->vpUpdate();
      //
      result=myKernel->endFrame();
      assert(result==vsgu::SUCCESS);
      pOwner->postFrame();
   }
///////////////////////////////////////////////////////////
//    vpKernel::instance()->breakFrameLoop();
   myKernel->breakFrameLoop();
   pOwner->unref();
   vsgu::shutdown();
   vp::shutdown();
   return 0;
}
出错的截图如下:
无标题.png

最近VR访客

xychengd专家组 评论于2014-1-8 08:43:37
请大家帮忙看看问题出在哪?谢谢!
程序中使用了vpLADBM,调用了地形数据
如果强制退出线程,再次创建线程时vpscene无法建立
obuil 评论于2014-1-8 10:09:13
确保 线程函数 先退出循环 并执行了
myKernel->breakFrameLoop();
   //pOwner->unref();
//  vsgu::shutdown();
   vp::shutdown();

然后wait线程或者终止线程

中间两行可注释掉
UE4   |   虚幻引擎   |   Unity VR    |    Hololens
csutest 评论于2014-1-9 00:56:36
你这是要退出线程,然后再新开线程加载ACF吗?
xychengd专家组 评论于2014-1-11 22:58:30 来自手机
csutest 发表于 2014-1-9 12:56 AM
你这是要退出线程,然后再新开线程加载ACF吗?

是的,再次加载的时候出错,define处
csutest 评论于2014-1-12 20:48:52
xychengd 发表于 2014-1-11 10:58 PM
是的,再次加载的时候出错,define处

vp2.2重新开线程要能用的话,基本就回到vp2.0的时代了,很多东西不能用。建议换个思路,不重新开辟线程,而是一开始就自己管理程序中vp相关的实体和状态,第二次运行的时候直接重置这些实体的状态或者设置新的状态,而且这样由于避免了再次加载,运行速度也快些。
xychengd专家组 评论于2014-1-19 19:53:04
csutest 发表于 2014-1-12 08:48 PM
vp2.2重新开线程要能用的话,基本就回到vp2.0的时代了,很多东西不能用。建议换个思路,不重新开辟线程, ...

谢谢!明白你的意思了,我把每个vp线程放在一个独立的进程中,退出时,连同进程一块退出,就OK了
csutest 评论于2014-1-19 21:04:34
xychengd 发表于 2014-1-19 07:53 PM
谢谢!明白你的意思了,我把每个vp线程放在一个独立的进程中,退出时,连同进程一块退出,就OK了 ...

进程当然可以,N年前就有人这么做过了,网上论文一大把,这种方式说白了还是没搞懂vp
内存的问题,大家都用线程是因为线程快,通信也简单,进程慢,跨进程通信也麻烦。

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2021-5-13 11:34 AM

返回顶部