Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ТThread и утечка памяти, вопрос внутри 
V
    Опции темы
Lazin
Дата 3.8.2007, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 18
Всего: 154



Возникла странная проблема. Я написал диалог, в котором юзеру предлагается подредактировать параметры, а паралельно с этим в потоке генерится изображение, а на нем результат применения параметров. С синхронизацией всё нормально, но появляется утечка памяти (увеличивается количество объектов GDI), отчего я понять не могу. CodeGuard молчит.
Код

Код

void __fastcall TImageProcessingThread :: Execute()
{
    image = new Graphics::TBitmap();
    image->LoadFromFile("картинко.bmp");//исходное изображение - грузится из файла

    while ( ! Terminated ) 
    {
     Sleep(50);
        
        
     if (Flag)
        {  
            image->Canvas->Lock();//поток использующий этот объект один но без этого всё ламаеца
            

            TBitmap *bmp = new TBitmap;//i4l::Dithering(image, apply_task.Threshold);

        bmp->Height = image->Height;
            bmp->Width  = image->Width;
//normal
            bmp->Canvas->Brush->Color = random(0xffffff);
            bmp->Canvas->FillRect( TRect(0,0,300,300) );
//bug - при добавлении этой строчки количество памяти начинает расти
        BitBlt(bmp->Canvas->Handle, 0,0, image->Width, image->Height, image->Canvas->Handle, 0,0, SRCCOPY);
           //так то-же самое
           //bmp->Canvas->CopyRect(TRect(0,0,image->Width,image->Height), image->Canvas);



            //рисуем bmp на канве TImage который лежит на форме
        preview->Lock();
            TRect Rect = TRect(0,0,image->Width,image->Height);
            preview->CopyRect(Rect, bmp->Canvas, Rect);
            preview->Unlock();
            delete bmp;

            image->Canvas->Unlock();
        }
        
    }
}

В общем я не представляю с чем это может быть связано, но что-то здесь не удаляется.  
PS
поток создается один.


Это сообщение отредактировал(а) Lazin - 3.8.2007, 09:27
PM MAIL Skype GTalk   Вверх
_Dimon_
Дата 3.8.2007, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 25.6.2007
Где: Украина

Репутация: 1
Всего: 1



Почему нет
Код

delete image;


PM MAIL   Вверх
Lazin
Дата 3.8.2007, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 18
Всего: 154



Есть, в деструкторе. Утечка в цикле, там создаётся bmp и там-же удаляется.
PM MAIL Skype GTalk   Вверх
ksili
Дата 3.8.2007, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Может Rect объявить вне цикла?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Lazin
Дата 3.8.2007, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 18
Всего: 154



Не помогло, EOutOfResurses - всему виной.
PM MAIL Skype GTalk   Вверх
dumb
Дата 3.8.2007, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



afair, причина в Lock(). деталей не помню... smile в потоке таки api юзай
PM MAIL   Вверх
ksili
Дата 3.8.2007, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Кстати может Lock/Unlock тоже делать вне цикла, раз эту канву больше никто не использует?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Lazin
Дата 3.8.2007, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 18
Всего: 154



Сделал так, утечка пропала, но изза чего она была я так и не понял. Может из за того что Graphics::TBitmap использует механизм copy on modify?
Код

void __fastcall TImageProcessingThread :: Execute()
{
    image = new Graphics::TBitmap();
    image->LoadFromFile("картинко.bmp");
    HDC imgDC = CreateCompatibleDC(image->Canvas->Handle);
    SelectObject(imgDC, image->Handle);
    TRect Rect;
    while ( ! Terminated ) {
     Sleep(50);
        
        
     if (Flag)
        {
         
            image->Canvas->Lock();

            TBitmap *bmp = new TBitmap;
            bmp->Height = image->Height;
            bmp->Width  = image->Width;
            HDC  bmpDC = CreateCompatibleDC(bmp->Canvas->Handle);
            SelectObject(bmpDC, bmp->Handle);
//---------
            BitBlt(bmpDC, 0,0, image->Width, image->Height, imgDC, 0,0, SRCCOPY);
            DeleteDC(bmpDC);
            image->Canvas->Unlock();
            
            preview->Lock();
            Rect = TRect(0,0,image->Width,image->Height);
            preview->CopyRect(Rect, bmp->Canvas, Rect);
            preview->Unlock();
            delete bmp;
        }
        
    }
}

ЗЫ
счетчик объектов GDI медленно но растет smile 
PM MAIL Skype GTalk   Вверх
SASp
  Дата 20.3.2008, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 20.3.2008

Репутация: нет
Всего: нет



БЛИН столкнулся с точно такой же проблемой!!!!!, тока я копирую в потоке часть экрана в Bitmap   ,делаю некий анализ этого Bitmapa и удаляю его на месте,   и уже вторую неделю немогу найти ,куда уходит память smile  smile  smile  smile    
PM MAIL   Вверх
korian
Дата 20.3.2008, 03:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



я не помню, но поидее это из-за DeleteDC(bmpDC); (можно кстати проверить, он должен 0 возвращать, если проблема в этом)
но даже, если не в этом, то MSDN пишет
Цитата

An application should always replace a new object with the original, default object after it has finished drawing with the new object. 


так, что делать надо так:
Код

            HDC  bmpDC = CreateCompatibleDC(bmp->Canvas->Handle);
            HGDIOBJ hOldBitmap = SelectObject(bmpDC, bmp->Handle);
//---------
            BitBlt(bmpDC, 0,0, image->Width, image->Height, imgDC, 0,0, SRCCOPY);

            SelectObject(bmpDC, hOldBitmap);
            DeleteDC(bmpDC);


Это сообщение отредактировал(а) korian - 20.3.2008, 03:18
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0915 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.