最近从事的一个图形处理软件的开发,平台是windows嵌入式xp上的MFC框架程序。有自己开发的板卡,以及工控板商提供的显卡驱动。
应用程序统一使用Direct3D做最后图像的屏幕显示。笔者负责的一个模块功能,使用OpenGL引擎渲染一幅图。创建RC和使用OpenGL在另外的线程。创建渲染环境时,hide窗口,然后用glReadPixels取像素结果。创建窗口以及渲染环境的语句大致如下(和Nehe):
先GetModuleHandle获得应用程序句柄
注册窗口类
然后CreateWindowsEx创建窗口
GetDC
ChoosePixelFormat
SetPixelFormat
wglCreateContext
wglMakeCurrent删除的时候
wglMakeCurrent
wglDeleteContext
ReleaseDC
DestroyWindow
注销注册现在的问题是:随着模块的启动和关闭会反复创建和销毁OpenGL渲染环境,每次销毁之后,发现GDI对象不会销毁,继续增长。
也不是必发,发生的概率很大,并且只有在嵌入式xp上才出现。
怀疑过是驱动问题,还是多线程问题?还是创建窗口时的参数有问题?
总之确定不了原因。请教牛人指点迷津!!?
多线程OpenGLgdi嵌入式

解决方案 »

  1.   

    同时也问一下:
    ChoosePixelFormat这个API有什么机关么?为啥每掉一次就增长4个GDI句柄
      

  2.   

    这个可能是系统的一个Bug,我同学初学制作基于win32的俄罗斯方块程序,同时也是反复地向系统申请GDI句柄和释放句柄,导致内存泄漏。由于微软的GDI技术是其核心技术之一,我们也无从得知到底发生了什么。以后只能尽量避免频繁地使用微软的需要申请内存的函数,诸如Create*()或Get*()。