请问各位,在什么情况下会出现这种情况?

解决方案 »

  1.   

    我记得TransparentBlt这个API会这样
    在98下会引起资源泄漏
    在2k以上没事
      

  2.   

    只有一个原因,pen,font ,bitmap等未能释放。
      

  3.   

    to kingcom_xu(刀是用来杀人的!) 
    没有发现TransparentBlt
      

  4.   

    用boundschecker察察哪个函数有问题
      

  5.   

    pen,font ,bitmap怎么释放??不好意思我的是不懂
      

  6.   

    DeleteObject();里面是pen,font,等等
      

  7.   

    如果不放在循环里不释放也无所谓,但是如果像
    CPen PEN;
    WHILE(TURE)
    {
    PEN.CREATEPEN(...);
    PEN.DELETEOBJECT();//必须做
    }
      

  8.   

    to  fingerfox(foxfinger)
    我上面好象也没有WHILE(TURE)
      

  9.   

    gdi对象稍微多点就完蛋了,大概是1000吧。我是过,98下开6个空vc,就会报资源不足。一定要及时释放gdi。记得是及时,不是最后一起释放。
      

  10.   

    另外找一个能查看98下gdi资源的工具,就像2000的的任务管理器一样的东西。我用的是Cool tray 1.0.0版,去网上找找看。
      

  11.   

    不一定是WHILE(true)
    只要是循环那样就不行
      

  12.   

    怎样使用boundschecker??
    -----------]
    先安装boundschecker
    菜单-〉boundschecker->view->boundschecker
    选几个你要测试的操作系统 确定就会列出一个报告说哪个函数再哪个系统中无法运行!
      

  13.   

    sorry 粘错了
    菜单-〉boundschecker->view->菜单-〉compliance report
    ....
      

  14.   

    这是典型的资源泄漏,以前我们也碰到过。你可以现用98的资源查看器看看是什么资源用光了,如果是GDI资源,那就一定是你的程序中使用了图形对象,譬如说:你在一个函数中声明了一个Bitmap对象,但是在退出函数时你没有调用Bitmap对象的释放功能,在2000和Xp下,系统会自动释放局部变量的图形资源,但是98下不会。你可以试试。
      

  15.   

    仔细看 MSDN 中各种资源的释放方法. 别看MFC部分的, 看 PLATFORM SDK 部分的.
      

  16.   

    这位老兄和我撞见一样的问题了, 前一段时间谢一个数据采集的程序,我使用非模态对话框显示各个采集点的数据,总共最多有512个。每个对话框中都用了许多的Windows标准控制。每个窗口显示8点,结果...。于是,我使用一个线程接受数据,然后发送到各个窗口,窗口接收数据以后自己绘制图形(模仿标准控制)这样使用一个绘图处理器在Windows98下面也可以了。你是否可以借鉴一下呢?关于在Windows98和WindowNT中,各种系统资源的数目你可以参考《Windows图形编程》。
      

  17.   

    我构造用
    CPen *rPen=new CPen(PS_SOLID, 2, RGB(255,0,0));
    释放用
      delete rPen;
    怎么还是不能解决问题,我错在那里??
      

  18.   

    我是发现我的gdi慢慢的变少,我是在ontimer中调用drowpicture,在里面用到cpen font等东西,是不是无解拉。好象是内存空间无法完全释放
      

  19.   

    肯定是资源hDC,hPen等没释放,你把代码发给我,我帮你看看吧.我以前做过类似的东西,结果发现2k 下正常,98下出错,就是上面的原因.
      

  20.   


    CPen *yellowPen=new CPen(PS_SOLID,1,RGB(255,255,0));
    dc.SelectObject(yellowPen); dc.MoveTo(x,y);tx = (int)floor(x+m_dUA*m_iZoom/base_u*base_radius*cos(m_dUFA/180*3.14));
    ty = (int)floor(y-m_dUA*m_iZoom/base_u*base_radius*sin(m_dUFA/180*3.14));
        
    if (((tx-x)*(tx-x)+(ty-y)*(ty-y)) <= fr1)
        {
    dc.LineTo(tx, ty);
    if (m_dUA != 0)
    {
    dc.LineTo((int)(tx-8*cos((m_dUFA-30)/180*3.14)),
    (int)(ty+8*sin((m_dUFA-30)/180*3.14)));
    dc.MoveTo(tx, ty);
    dc.LineTo((int)(tx-8*cos((m_dUFA+30)/180*3.14)),
    (int)(ty+8*sin((m_dUFA+30)/180*3.14)));
    }
        }
    else
    {
    tx = (int)floor(x+(right-left)/2*cos(m_dUFA/180*3.14));
    ty = (int)floor(y-(right-left)/2*sin(m_dUFA/180*3.14));
      dc.LineTo(tx,ty);
      }
         delete yellowPen;
    这是我的在drowpicture中的代码
    我在ontimer中调用它
    感谢拉
      

  21.   

    CPen* pOldPen = dc.selectobject(yellopen);
    ...
    dc.selectobject(pOldPen);
    没有把DC里的PEN选回去!!
      

  22.   

    CPen *yellowPen=new CPen(PS_SOLID,1,RGB(255,255,0));
    CPen* pOldPen;//ADD
    pOldPen=(CPen*)dc.SelectObject(yellowPen);//MODIFY dc.MoveTo(x,y);tx = (int)floor(x+m_dUA*m_iZoom/base_u*base_radius*cos(m_dUFA/180*3.14));
    ty = (int)floor(y-m_dUA*m_iZoom/base_u*base_radius*sin(m_dUFA/180*3.14));
        
    if (((tx-x)*(tx-x)+(ty-y)*(ty-y)) <= fr1)
        {
    dc.LineTo(tx, ty);
    if (m_dUA != 0)
    {
    dc.LineTo((int)(tx-8*cos((m_dUFA-30)/180*3.14)),
    (int)(ty+8*sin((m_dUFA-30)/180*3.14)));
    dc.MoveTo(tx, ty);
    dc.LineTo((int)(tx-8*cos((m_dUFA+30)/180*3.14)),
    (int)(ty+8*sin((m_dUFA+30)/180*3.14)));
    }
        }
    else
    {
    tx = (int)floor(x+(right-left)/2*cos(m_dUFA/180*3.14));
    ty = (int)floor(y-(right-left)/2*sin(m_dUFA/180*3.14));
      dc.LineTo(tx,ty);
      }
    dc.SelectObject(pOldPen);//ADDyellowPen.DeleteObject();//ADD
         delete yellowPen;
      

  23.   

    在选Object时要保留原Object,即返回值
    结束时要选回原Object,并DeleteOjbect你自己创建的Object,不然资源泄漏.
    pOldPen=(CPen*)dc.SelectObject(yellowPen);
    ...
    dc.SelectObject(pOldPen);
    yellowPen.DeleteObject();
      

  24.   

    很同情你的遭遇,因为我也遇到过!
    我花了整整一个星期去调试,各种方法都试过了。什么资源我都释放了,可是98仍然那样。原因是在98下,其系统资源自己的回收工作可能没做好。
    CreatePen这种API都会泄漏资源。解决方法,在98下用LoadLibrary()
    用完了,再FreeLibrary
      

  25.   

    to  ccnuxjg() 能不能说详细一点?
      

  26.   

    我发了400分的帖子,还是没有人能够彻底的解决这个问题,后来终于皇天不负苦心人,让我给搞定了。http://expert.csdn.net/Expert/topic/1195/1195502.xml?temp=.2852442
    http://expert.csdn.net/Expert/topic/1204/1204109.xml?temp=.81094
      

  27.   

    这是个老问题了,Win98 下应该尽量减少重复创建 GDI 对象的次数,比如 CPen,CBrush,CBitmap, MemDC 都最好作为类成员在第一次使用时 Create ,然后在类实例撤销时释放。反复创建的结果往往导致“系统不能得到必需的资源”(我猜,可能没有即时回收释放的 GDI 句柄)。如果要求高的话,CDC::SelectObject 这种返回 CGdiObject* 的函数最好用 API SelectObject 代替,因为 MFC 会为任何找不到来源的 HGDIOBJ 句柄创建临时 CGdiObject 对象,而这种临时对象直到线程终止时才释放。
      

  28.   

    首先,你要确保你的程序里面你自己申请的资源都释放了,是由于调用GDI对象的次数太频繁之后才引起的问题,这个方法在98下面才可以正常运行。我的程序在98下面测试过,我创建Time,每0.02毫秒调用一次我的绘图函数,都能够正常运行。思路:就是在需要用的GDI对象的时候,动态载入GDI32.dll (因为CreatePen等函数的定义是在这里面的)  即LoadLibrary("GDI32.dll")
    HMODULE g_hGDIDLL = LoadLibrary("GDI32.dll");
    不用的时候再释放这个dll. 即FreeLibrary("GDI32.dll");载入之后,利用函数GetProcAddress(g_hGDI32DLL,("CreatePen"));来得到CreatePen的函数地址,再用函数指针来代替CreatePen函数。
      

  29.   

    cpen,cfont 应该在建立时就要设定释放~~~~~~~~~~~~~~~
      

  30.   

    // 画坐标轴
    CPen whitePen(PS_DOT, 1, RGB(255,255,255));
    CPen* pOldPen;
    pOldPen=(CPen*)dc.SelectObject(&whitePen);
    dc.SelectObject(&whitePen);
    dc.MoveTo(left-25,y);
    dc.LineTo(right+25,y);
    dc.MoveTo(x,top-15);
    dc.LineTo(x,bottom+20);
        dc.SelectObject(&pOldPen);//ADD    whitePen.DeleteObject();//ADD
    我改后,还是不行
      

  31.   

    我需要多次创建cpen,cfont没有办法啊!!!
      

  32.   

    pen,font ,bitmap等未能释放。