用户那边发现的问题,他打开这个程序的同时会同时打开其他几个软件,比如命令行窗口,bc31等
运行一段时间后就会出现奇怪的问题
比如:
下拉菜单显示黑色,看不见字,鼠标放到上面那一栏才显示出来
domodal的对话框关闭之后,界面有残留
还有比如组合框上的那个小箭头竟然变成了数字"6"
还有些莫名奇妙的错误,反正都和界面有关会不会是和那个软件冲突,或者那个软件狂吃资源,中毒,还是我软件有什么没有释放的东西

解决方案 »

  1.   

    GDI资源释放了吗?或者真是中毒 了?
      

  2.   

    可以肯定的是,是GDI资源泄漏造成的,仔细检查自己的代码吧。
      

  3.   

    这种问题不好分析,先说说你的软件是做什么的,有没有驱动程序、服务程序,有没有Hook,有没有进程间通讯?另外检查一下程序中是否有内存越界的情况。模拟一下客户的测试环境,要自己测试分析,必要时进行调试才好解决问题。
      

  4.   

    用户那边发现的问题,他打开这个程序的同时会同时打开其他几个软件,比如命令行窗口,bc31等 << 这肯定是中毒了吧!
    其他的不好说!
      

  5.   

    谢谢
    似乎没用到GDI资源,时间隔得比较久,有点忘了
    有个功能用到多线程,但是并没有启用这个功能比较简单的东西
    无非是listctrl显示表中的数据,插入删除修改什么的,只是用户的要求有些怪,但和界面有关系的就是重绘listctrl,改变当前行颜色,还有当前单元格颜色(文本框)
      

  6.   

    应该是自绘代码没有放到OnPaint里面调用,导致自动刷新时没有调用你的绘制代码
      

  7.   

    绘制界面肯定是使用了GDI资源的,用进程管理器可以查看进程的GDI资源数量(在“查看”菜单中“选择列”设置)。
    另外,也有可能是你自绘界面有bug,在特定环境下才体现出来。
      

  8.   

    重绘listctrl只是
    ON_NOTIFY_REFLECT ( NM_CUSTOMDRAW, OnCustomdrawList )
    而且
    只有运行一段时间才出错我在我的电脑商打开n个窗口,来回切换的很长时间也没错
    真郁闷
      

  9.   

    我也问个问题.
    gdi数量是不断增加吗.这和内存泄露有关系吗.
    我看QQ的程序就是在不断增加的
      

  10.   

    对于一些频繁打开释放的资源,比如,画笔,颜色...,
    我遇到过在循环中改变画线的颜色,不断的GetObject(),和releaseobject(),最后会出现类似于你的情况,
    我想可能还是某一类的资源没完全释放掉。
    可以在程序里监控一下内存资源。
      

  11.   

    应该是GDI资源释放的问题,例如你使用了CPen, CBrush等,一定要调用x.DeleteObject(),如果使用了new指针也要及时释放。对方运行多个程序才会出现此问题,更加佐证了GDI问题,多个程序切换会导致你的主程序刷新界面,而你的主程序重绘,又要消耗GDI资源。如果只运行你的程序,界面刷性的情况很少甚至没有。
      

  12.   

    首先得需要能够将该现象在你的环境下重现,再往下讨论。不然怎么debug
      

  13.   

    我目前还没测出来
    据说插入删除操作近100次会出现这种现象...access有点问题,就是删除的东西并没有物理删除,以至于表会越变越大
    100次之后可能就有几百兆了
    如果上G,难道就会出现这种问题?(当然access有上限,好像是2G)超过2G是报错而不是这种现象啊理论上
      

  14.   

    自绘的也就是这
    void CEditListCtrl::OnCustomdrawList( NMHDR* pNMHDR, LRESULT* pResult )
    {
    NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );

        
        *pResult = 0;

        

        if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
    {
            *pResult = CDRF_NOTIFYITEMDRAW;
    }
        else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
    {

            *pResult = CDRF_NOTIFYSUBITEMDRAW;
    }
        else if ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage )
    {
            

            int   nItem=(int)(pLVCD->nmcd.dwItemSpec);  
        
    if(nItem==m_nItem){

    // pLVCD->clrText   =   RGB(255,155,255);  
    pLVCD->clrTextBk   =   RGB(255,0,0);       }
    *pResult   =   CDRF_DODEFAULT;   
    }
    }
      

  15.   

    用户又出现了这种情况
    我看了下GDI对象,9999个
      

  16.   

    GDI个数这么大,肯定是有问题了。是你的进程吗?有可能是某些情况没释放,也有可能是没释放成功。GDI资源泄露有两种常见的原因: 
    1、响应WM_CTLCOLOR消息时,先调用了基类函数,最后返回的不是基类函数的返回值; 
    2、DeleteObject前,没有用SelectObject把对象从DC中换出。另外,你把自绘的代码分别去掉再测试看看,确定一下与哪段代码有关。
      

  17.   


    所以,就是GDI资源泄漏,我在7楼就已经指出,还是“仔细检查自己的代码吧”!
      

  18.   

    应该就是GDI资源泄漏,这种问题我遇到过
      

  19.   

    用bc可以看是什么地方gdi资源泄漏..一般就是dc这些或者说是pen这些没释放
      

  20.   

    本人觉得可能有两个原因,以前我也遇到过:
    1、一个是因为你的在获取GDI对象后,最后没有释放,比如,你在绘图时调用了CDC *pDC = GetDC();而在用完后没有调用ReleaseDC(pDC),这样反复调用的次数多了以后肯定会出现你说的那种情况。
    2、再一个问题你不是你的系统很消耗内存资源呀。
      

  21.   

    运行了BC31的问题,我常遇到,特别是在98下。
    让他一直不开BC31运行你的程序,观察一段时间,看是否还会出现这种现象。
      

  22.   

    第一条的怀疑是最大的,偶遇到过类似的问题,当时是连续运行5小时后发生变"6"问题,背景变黑问题,结果经过仔细查问题,最后发现,软件中一个特别特别显眼的地方,一个HDC没有ReleaseDC。
      

  23.   

    如果自己实在检查不出来, 装个BC看看吧前面的都说了, GetDC 和 ReleaseDC 要成对出现
      

  24.   

    这个可能性非常大,我以前也遇到过这样的问题,GDI资源泄漏造成的
      

  25.   

    问:
    使用局部的类对象,是不是不用调用DeleteObject();
    如:
    CBitmap bmp;
    bmp.CreateCompatibleBitmap(..);CDC dc;
    dc.CreateCompatibleDC(..); 不用执行
     bmp.DeleteObject();
    dc.DeleteObject();