Выгрузка GDI ресурсов
От: AlexDS2  
Дата: 31.01.07 14:49
Оценка:
Есть вот такой код:
//------------------
ID=199;
for(int i=0;ID<206;i++,ID++)
{
m_parBmp[i]=new CBitmap();

m_parBmp[i]=GetSkin().LoadCBitmap(MAKEINTRESOURCE(ID));
}


MessageBox("loaded");

ID=199;
for(int i=0;ID<206;i++,ID++)
{

delete m_parBmp[i];
}

MessageBox("Unloaded");
//--------------------------

В это время смотрел на использование памяти приложением, получается вот что:
— Пока мы не загрузили эти битмапки память под приложение находится на каком-то уровне скажем 1200 кб и кол-во GDI обьектов скажем 150
— после работы куска этого кода до первого месседж бокса — после его появления кол-во GDI обьектов увеличивается и выделяемая память соотв. тоже — стает 2000 кб и 158 GDI обьектов
После появления второго мессаджбокса смотрим.. и видим что кол-во GDI обьектов приняло старое значение — 150 а кол-во памяти не поменялось — осталось 2000 кб и в течении 20 мин не выгружалась!

Вопрос: как сделать так чтоб выгрузить всё-таки из памяти приложения эти ресурсы если они не используются???

31.01.07 18:26: Перенесено модератором из 'C/C++' — Кодт
Re: Выгрузка GDI ресурсов
От: 0x8000FFFF Россия  
Дата: 31.01.07 15:02
Оценка:
MSDN:

You can use the CGdiObject::DeleteObject function to delete a bitmap loaded by the LoadBitmap function, or the CBitmap destructor deletes the object for you.

Before you delete the object, make sure it is not selected into a device context.
Re[2]: Выгрузка GDI ресурсов
От: AlexDS2  
Дата: 31.01.07 15:13
Оценка:
Здравствуйте, 0x8000FFFF, Вы писали:

FFF>MSDN:


FFF>You can use the CGdiObject::DeleteObject function to delete a bitmap loaded by the LoadBitmap function, or the CBitmap destructor deletes the object for you.


FFF>Before you delete the object, make sure it is not selected into a device context.


Я тоже читал MSDN удалял и через DeleteObject ничего не меняется- ситуация остается такая же...
Re: Выгрузка GDI ресурсов
От: 0x8000FFFF Россия  
Дата: 31.01.07 15:15
Оценка:
Кстати еще раз глянул в исходники CBitmap

afxwin.h

class CBitmap : public CGdiObject
{
    DECLARE_DYNAMIC(CBitmap)

public:
    static CBitmap* PASCAL FromHandle(HBITMAP hBitmap);

// Constructors
    CBitmap();

    BOOL LoadBitmap(LPCTSTR lpszResourceName);
    BOOL LoadBitmap(UINT nIDResource);
    BOOL LoadOEMBitmap(UINT nIDBitmap); // for OBM_/OCR_/OIC_
    BOOL LoadMappedBitmap(UINT nIDBitmap, UINT nFlags = 0,
        LPCOLORMAP lpColorMap = NULL, int nMapSize = 0);
    BOOL CreateBitmap(int nWidth, int nHeight, UINT nPlanes, UINT nBitcount,
            const void* lpBits);
    BOOL CreateBitmapIndirect(LPBITMAP lpBitmap);
    BOOL CreateCompatibleBitmap(CDC* pDC, int nWidth, int nHeight);
    BOOL CreateDiscardableBitmap(CDC* pDC, int nWidth, int nHeight);

// Attributes
    operator HBITMAP() const;
    int GetBitmap(BITMAP* pBitMap);

// Operations
    DWORD SetBitmapBits(DWORD dwCount, const void* lpBits);
    DWORD GetBitmapBits(DWORD dwCount, LPVOID lpBits) const;
    CSize SetBitmapDimension(int nWidth, int nHeight);
    CSize GetBitmapDimension() const;

// Implementation
public:
    virtual ~CBitmap();
#ifdef _DEBUG
    virtual void Dump(CDumpContext& dc) const;
#endif
};



afxwin1.inl
_AFXWIN_INLINE CBitmap::~CBitmap()
    { }


afxwin1.inl
_AFXWIN_INLINE CGdiObject::~CGdiObject()
    { DeleteObject(); }


Вроде все хорошо... должно удаляться
Re[2]: Выгрузка GDI ресурсов
От: AlexDS2  
Дата: 31.01.07 15:21
Оценка:
FFF>Вроде все хорошо... должно удаляться

Оно то всё нормально — кол-во GDI обьектов уменьшилось но память выделенная под эти битмапки не освободилась...
Re: Выгрузка GDI ресурсов
От: 0x8000FFFF Россия  
Дата: 31.01.07 15:37
Оценка:
Погоди... не посмотрел код внимательно....

ID=199;
for(int i=0;ID<206;i++,ID++)
{
m_parBmp[i]=new CBitmap();

m_parBmp[i]=GetSkin().LoadCBitmap(MAKEINTRESOURCE(ID));
}

А это еще что такое... CBitmap создал.... сразу заменил его другим...
а потом удаляешь уже другой....
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.