OpenGL 程序运行一段时间后出现CResourceException

时间:2021-11-14 16:59:05
为什么OpenGL在运行一段时间后会跑出CResourceException啊?该如何解决啊? 
在两个静态控件里同时用OpenGL 绘图, 
其中一个是静态里 
void CWaveDisplay::OnPaint() 


CPaintDC dc( this ); 
GetClientRect( &mCtrlRect ); 
SwapBuffers(dc.m_ps.hdc); 

wglMakeCurrent(NULL,NULL); 
HWND hWnd = this->GetSafeHwnd();    
        HDC hDC = ::GetDC(hWnd); 
wglMakeCurrent(NULL,NULL); 
wglMakeCurrent(hDC,this->m_hGLContext); 

glLoadIdentity(); 
glClearColor(0,0,0,1); //清屏 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

DrawWave();  //绘图程序 

wglMakeCurrent(NULL,NULL); 
::ReleaseDC(hWnd,hDC); 

另一个是 
void CMyDisplayWave::OnTimer(UINT_PTR nIDEvent) 

// TODO: 在此添加消息处理程序代码和/或调用默认值 
wglMakeCurrent(NULL,NULL); 
HWND hWnd = this->GetSafeHwnd();    
    HDC hDC = ::GetDC(hWnd); 
wglMakeCurrent(NULL,NULL); 
wglMakeCurrent(hDC,this->m_hGLContext); 
DrawGrid();  // 绘图程序 
DrawScale();  // 绘图程序 
ShowState();  // 绘图程序 
DrawWave();  // 绘图程序 
Invalidate(FALSE); 

wglMakeCurrent(NULL,NULL); 
::ReleaseDC(hWnd,hDC); 
CStatic::OnTimer(nIDEvent); 


运行一段时间后就会抛出MedicalSoftware.exe 中的 0x7c812a5b 处最可能的异常: Microsoft C++ 异常: 内存位置 0x000e7118 处的 CResourceException。 
Warning: Uncaught exception in WindowProc (returning 0). 
如何解决啊?

4 个解决方案

#1


友情帮顶了。

#2


注意下hDC

#3


先将一些显示的函数去掉,看看是否有问题!如果再有问题,你再去掉一部分!
我个人认为,是wglMakeCurrent经常调用的问题!这个你放在onpaint里面调用,又放到ontime里面调用,太频繁了,这个最好放在构造函数或者初始化函数里面调用一次,以后都使用!
另外,wglMakeCurrent后,还要调用wglDeleteContext,你这个没有调用,我觉的,这个才是程序死掉的关键!

#4


wglMakeCurrent在构造函数里已经调用了,因为需要在两个界面同时显示,需要不停的切换,所以就经常调用wglMakeCurrent,onpaint和ontimer是在两个不同的界面里调用,如果每次调用wglMakeCurrent后再调用wglDeleteContext,就不会显示了,wglDeleteContext我在OnDestroy里调用了。如果要想两个界面同时显示的话该怎么解决啊?

#1


友情帮顶了。

#2


注意下hDC

#3


先将一些显示的函数去掉,看看是否有问题!如果再有问题,你再去掉一部分!
我个人认为,是wglMakeCurrent经常调用的问题!这个你放在onpaint里面调用,又放到ontime里面调用,太频繁了,这个最好放在构造函数或者初始化函数里面调用一次,以后都使用!
另外,wglMakeCurrent后,还要调用wglDeleteContext,你这个没有调用,我觉的,这个才是程序死掉的关键!

#4


wglMakeCurrent在构造函数里已经调用了,因为需要在两个界面同时显示,需要不停的切换,所以就经常调用wglMakeCurrent,onpaint和ontimer是在两个不同的界面里调用,如果每次调用wglMakeCurrent后再调用wglDeleteContext,就不会显示了,wglDeleteContext我在OnDestroy里调用了。如果要想两个界面同时显示的话该怎么解决啊?