EOutOfResources po ok 10tys bmp

0

Witam,

potrzebuję mieć duuuuużo bitmapek. Mają dość małe rozmiary - rzędu kilkadziesiąt x kilkadziesiąt. No i pojawia się problem po utworzeniu ok 10tys. Rzucany jest EOutOfResources, czyli brak uchwytów, wina systemu.. wiem.

Jak to obejść?? Zrobiłem testowy programik i działa:

void __fastcall TForm1::Button15Click(TObject *Sender)
{
    Graphics::TBitmap * bmp = new(nothrow) Graphics::TBitmap();
    if(!bmp){
        ShowMessage("Brak pamieci");
        return;
    }
    bmp->PixelFormat = pf24bit;
    bmp->Width = 32;
    bmp->Height = 40;

    bool res = true;

    TImageList * timl [11];
    for(int i = 0; i < 11; i++){
        timl[i] = new (nothrow) TImageList(Application);
        if(!timl[i]){
            ShowMessage("Brak pamieci");
            res = false;
            break;
        }
        timl[i]->AllocBy = 1000;
        timl[i]->Width = 32;
        timl[i]->Height = 40;
    }

    if(res){
        for(int i = 0; i < 11000; i++){
            if(timl[i/1000]->Add(bmp, NULL) == -1){
                ShowMessage("Brak pamieci: " + IntToStr(i));
                res = false;
                break;
            }
            pb1->StepIt();
        }
    }

    ShowMessage(res ? "OK" : "Blad");

    delete bmp;
    for(int i = 0; i < 11; i++){
        delete timl[i];
    }
}

Ale muszę wtedy operować na ImageListach. Mam już dość duży program (ok 10 tys linii) i zmieni mi to ogromnie całą komunikację z bitmapami. Jest jakiś inny sposób?

0

OMFG!!!

Zmień to jak najszybciej na ImageListy albo coś podobnego. Kilka tysięcy uchwytów do... bitmapek? Czyś ty na głowę upadł, litości dla systemu, użytkownika i zasobów nie masz?

10 tys. to w cholerę, przyznaję... ale chyba nie wszędzie polegasz na tych bitmapkach? Nie wiem, załóżmy, że teraz masz tablicę dynamiczną TBitmap* i później na tym polegasz. Spróbuj może napisać klasę-wrapper, która tablicę będzie udawać, a w środku, w implementacji, będzie polegać na ImageList - czyli głównie przeładuj operator[], może będzie mniej poprawek.

0

Hehe, mam litość dla wszystkich :)

To jest program do tworzenia animacji, więc uchwyty muszą być i to szybko. Przeglądanie, podgląd, kasowanie, przemieszczanie lewo - prawo, dodawanie, nakładanie.. Szlag jasny.

Hmm, uchwyty są podpięte pod proces, który je tworzy, nie? Więc gdyby inny proces je tworzył, to powinno być ok? Może wątki tu coś poradzą...

0

nie tedy droga.. to juz lepiej zamiast uzywac 1e+7 bitmapek, utworz jedna/kilka duzych i z nich wycinaj i zwracaj w locie fragmenty zachowujace sie jak samodzielne bitmapy (ale nimi nie bedace!)

0

Lista list pozostaje najlepszym wyjściem, więc trzeba się będzie brać za przerabianie. :]

0

Jeśli bitmapy maja te same metadane (rozmiar, głębia kolorów itp.) to najlepiej jak będziesz trzymać po prostu w pamięci same piksele w postaci tablic. Będzie to dużo wydajniejsze rozwiązanie.

0

W sumie też jakieś wyjście. Ale za każdym razem, kiedy będę potrzebował wyświetlić taką bmp, muszę ją tworzyć - uzupełniać BITMAPINFOHEADERy, SetDiBits.. Chyba jednak pozostanę przy Liście List.

Dzięki za odpowiedzi.

0

Chyba żartujesz - poczytaj może o bitmapach na MSDN? Głównie polecam zapoznanie się z funkcjami CreateDIBitmap i CreateDIBSection.

0

ImageListy są jednak dla mnie w tym przypadku wygodniejsze.

0

Tak to już jest w programowaniu ze wygoda nie idzie w parze ze skutecznością, a wręcz są sobie przeciwstawne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1