查看: 2011|回复: 2

MFC ActiveX程序循环加载模型时崩溃,求解

[复制链接]

该用户从未签到

发表于 2011-9-2 19:43:01 | 显示全部楼层 |阅读模式
本帖最后由 chyzh 于 2011-9-2 19:46 编辑

我最近在做一个MFC ActiveX程序,通过IE浏览器来运行,需要循环加载同一个模型多次,但浏览器经常出现崩溃报内存“0X000000”不能read,困扰多日未果,望高手指点迷津。
下面是主要的代码:



osg::ref_ptr<osg::MatrixTransform> car[14][2];

void RenderThread(void* ptr)
{
osgViewer::Viewer* viewer = (osgViewer::Viewer*)ptr;

while( !viewer->done() )
{
  viewer->frame();
}
::MessageBox(0, L"渲染进程已经终止", L"警告", MB_OK);
_endthread();
}
int CosgMFCAxCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (COleControl::OnCreate(lpCreateStruct) == -1)
  return -1;
   
//初始化局部变量,开辟内存空间
m_Filename = new char[255];
m_Viewpoint= new char[255];
m_Url=new char[255];
m_Area= new char[10];
m_Option=new char[10];
filename=new char[255];
loadfile=new char[255];

// chyzh获取当前响应窗口的大小
RECT rect;
GetWindowRect(&rect);
/*WCHAR str[255];
swprintf(str, L"(%d,%d) - (%d,%d)", rect.left,rect.top,rect.right,rect.bottom);
::MessageBox(0, (LPCWSTR)str, L"Hint", MB_OK);*/
// Set window traits and gc
m_Traits = new osg::GraphicsContext::Traits;
osg::ref_ptr<osg::Referenced> windata = new
osgViewer::GraphicsWindowWin32::WindowData( GetSafeHwnd() );
m_Traits->x = 0;
m_Traits->y = 0;
m_Traits->width = rect.right - rect.left;
m_Traits->height = rect.bottom - rect.top;
m_Traits->windowDecoration = false;
m_Traits->doubleBuffer = true;
m_Traits->sharedContext = 0;
m_Traits->setInheritedWindowPixelFormat = true;
m_Traits->inheritedWindowData = windata;
osg::GraphicsContext* gc = osg::GraphicsContext::createGraphicsContext(
m_Traits.get() );
//  chyzh将窗口图形上下文传递给新建的摄像机,并设置摄像机的视口,透视矩阵等参数
osg::ref_ptr<osg::Camera> camera = new osg::Camera;
camera->setGraphicsContext(gc);
camera->setViewport( new osg::Viewport(m_Traits->x, m_Traits->y, m_Traits->width,
m_Traits->height) );
    camera->setProjectionMatrixAsPerspective( 10.0f, (double)m_Traits->width/(double)
m_Traits->height, 1.0f, 10000.0f );
m_Viewer = new osgViewer::Viewer;
m_Viewer->setThreadingModel( osgViewer::Viewer::SingleThreaded );
m_Viewer->setCamera( camera.get() );
//增加控制器,以调整视点
        mycamera = new MyCameraManipulator;
        mycamera->setPosRot(0,-30,0,0,0,0);
m_Viewer->setCameraManipulator( mycamera );
m_Root = new osg::Group;
m_Viewer->setSceneData( m_Root.get() );
m_Viewer->realize();
//  开启新的渲染线程
_beginthread(&RenderThread, 0, m_Viewer);
return 0;
}
osg::MatrixTransform* createobject1(const char*strFileName, double x, double y, double z)
{
osg::ref_ptr<osg::Node> model=new osg::Node;
model=osgDB::readNodeFile(strFileName);
osg::ref_ptr<osg::MatrixTransform> mt=new osg::MatrixTransform;
mt->setMatrix(osg::Matrix::translate(x,y,z));
mt->addChild(model);
return mt.release();
}
//-------------------------------------------------------------------------------------
//加载模型部分代码
void CosgMFCAxCtrl:oadFile(){
  filename="car.osg";
  for (int i=0;i<14;i++)
  {
car[i ][0]=createobject1(loadfile, 0, -40, 0);
if ( !car[i ][0].valid() )
{::MessageBox(0, A2BSTR("读取节点car0失败"), L"警告", MB_OK);}
else{
car[i ][0]->setDataVariance( osg::Object:YNAMIC );
m_Root->addChild(car[i ][0]);
}
car[i ][1]=createobject1(loadfile, 0, -40, 0);
if ( !car[i ][1].valid() )
{::MessageBox(0, A2BSTR("读取节点car1失败"), L"警告", MB_OK);}
else{

car[i ][1]->setDataVariance( osg::Object::DYNAMIC );
        m_Root->addChild(car[i ][1]);
   }
}

该用户从未签到

发表于 2011-9-5 08:50:01 | 显示全部楼层
请给出运行堆栈信息以及它在程序中的指向

该用户从未签到

发表于 2012-2-1 21:34:45 | 显示全部楼层
一般来说改成relaease后就没什么错误了。反正activex很折腾人,我的代码中包含了大量的延时、堵塞之类的语句。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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