Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
2 / 2 / 1
Регистрация: 31.01.2015
Сообщений: 26
1

TBitMap Canvas в многопотоке утечка памяти

29.05.2015, 18:26. Показов 2041. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
И так для теста на писал не сколько функций.
Тут все нормально очищает:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure TForm1.Button3Click(Sender: TObject);
var
  BitMap: TBitMap;
  InJPEG: TJpegImage;
  i: Integer;
begin
  for i := 0 to 200 do
  begin
    BitMap:= TBitMap.Create;
    BitMap.PixelFormat:= pf24bit;
    BitMap.Canvas.Brush.Color:= clWhite;
    BitMap.Width:= 600;
    BitMap.Height:= 2000;
 
    InJPEG:= TJpegImage.Create;
    InJPEG.Assign(MemoryImages[Random(Length(MemoryImages)-1)]);
 
    BitMap.Canvas.Draw(0,0,InJPEG);
    InJPEG.Free;
    BitMap.Free;
  end;
end;
В MemoryImages лежит массив с JPEG изображениями

Проходит цикл 200 в дитспечере задач "Память" показывает сколько было старта, столько и осталось после завершения.

Теперь же проблемное место. Тот же самый код беру и засовываю в функцию, а эта функция вызывается в потоке.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function TestBMP:String;
var
  BitMapIn: TBitMap;
  InJPEG: TJpegImage;
begin
  BitMapIn:= TBitMap.Create;
  BitMapIn.PixelFormat:= pf24bit;
  BitMapIn.Canvas.Brush.Color:= clWhite;
  BitMapIn.Width:= 600;
  BitMapIn.Height:= 2000;
 
  InJPEG:= TJpegImage.Create;
  InJPEG.Assign(MemoryImages[Random(Length(MemoryImages)-1)]);
 
  BitMapIn.Canvas.Draw(0,0,InJPEG);
  BitMapIn.Free;
  InJPEG.Free;
 
  Result:= '';
end;
То после создания и уничтожения потоков, в дистпечере задач начинает добавляться мегабайтами память. При завершении всех потоков, она не очищается, хотя потоки верно созданы и уничтожаются FreeOnTreminate:= True

Далее комментирую строчку //BitMapIn.Canvas.Draw(0,0,InJPEG); тогда нечего не переполняется. Что же делать?

Добавлено через 35 минут
Когда 1 мегабайтовая картинка в MemoryImages проходит 10 потоков, то после завершения в память добавляется +20-30 мб

Добавлено через 36 минут
В общем обернул в try except и он выдает это "JPEG error #68" или это "JPEG error #61" и то оставляет то нет по +10 мб в памяти. Конфликтует как то между собой чтоле когда в многопоток работает. Если слать в поток команду по 1 запросу. Т.е. Поток создал он отработал, потом опять создал. Не одновременно а по очередно, то нет переполнения. Как решить то из за чего он конфликтует?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.05.2015, 18:26
Ответы с готовыми решениями:

Утечка памяти в потоке при многократной обработке TBitmap
Делфи7. Создаётся поток, где в цикле создаётся Bitmap1 (5МByte), который сравнивается c Bitmap2,...

Утечка памяти Fmx::Graphics::TBitmap
Привет! Кто-нибудь сталкивался с утечкой памяти загрузке картинки из файла или из потока в TBitmap?...

Утечка памяти при работе с Graphics::TBitmap
Есть код (получаю картинку с IP-камеры): TIdHTTP *IdHTTP = new TIdHTTP (NULL);...

Создание компонента,как прикрутить TBitmap->Canvas
Как можно прикрутить канву например к TPanel что бы на нем можно было рисовать как на канве TImage...

4
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
29.05.2015, 21:36 2
Цитата Сообщение от Samsams Посмотреть сообщение
из за чего
Из-за MemoryImages

Не по теме:

И так
на писал
не сколько

0
2 / 2 / 1
Регистрация: 31.01.2015
Сообщений: 26
29.05.2015, 21:40  [ТС] 3
А как поступить, к примеру загружается картинки 3 и в течении дня они берутся и редактируются во много потоке. Как лучше реализовать. Я вот сделал когда софт запускается то в массив картинок загружаются картинки и далее из него уже потоки дергают изображения, видать то что одновременно бывает обращаются и происходит конфликт, так как лучше сделать через синхронизацию. Так скорость снизится
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
29.05.2015, 21:50 4
Цитата Сообщение от Samsams Посмотреть сообщение
берутся и редактируются во много потоке
Цитата Сообщение от Samsams Посмотреть сообщение
из него уже потоки дергают изображения
"Дерготня" в приведенном тобой коде присутствует
А редактированием и близко не пахнет.
0
2 / 2 / 1
Регистрация: 31.01.2015
Сообщений: 26
29.05.2015, 23:38  [ТС] 5
Это я пример привел, а основной код большой. Редактирует нормально все. Там переполнения нету. Анализировал проверял все. Ладно с дерганьем пофиг другое ченить придумаю, а вот про редактирование спрошу. Вообщем когда картинка выдернута, она разрезается на не сколько частей рандом строк, рандом столбцов. И вот еще одна проблема, я значит копиректом копирую по вычисленным координатам в новосозданый BitMap:
Delphi
1
2
3
4
5
BitMapR.Canvas.CopyRect(
Rect(0,0,tmpX2,tmpY2),
MemoryImages[Random(Length(MemoryImages)-1)].Canvas,
Rect(tmpX1,tmpY1,tmpX2+CountW,tmpY2+CountH)
);
И тут при 100 потоках, гдето 1 на 200 пройденных потоков, бывает что после копирования и при выполнения следующего кода в BitMapR еще нету скопированного куска. Т.е. я его дальше гоню в конвертацию Base64, а в нем пусто. Решил по извращенски сначало сохраняю в файл и сразу загружаю тот же файл в него:
Delphi
1
2
3
4
BStream:= TFileStream.Create(ExtractFilePath(Application.ExeName)+'tmp\'+FileNameJPG+'.bmp',fmCreate);
BitMapR.SaveToStream(BStream);
BStream.Free;
BitMapR.LoadFromFile(ExtractFilePath(Application.ExeName)+'tmp\'+FileNameJPG+'.bmp');
Это опять же занимает какое-то время, т.к. битмапы и весят не мало. Но что только не пробовал и в stream и draw. Что на это скажешь?

Добавлено через 43 минуты
Вылетает исключение "canvas does not allow drawing". С тем извращением реже)
0
29.05.2015, 23:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.05.2015, 23:38
Помогаю со студенческими работами здесь

TJpegImage в TBitmap, и как можно использовать Canvas для JPEG без потери качества!
Доброго времени суток. Мне интересно если перегонять TJpegImage в TBitmap таким способом: uses...

Canvas утечка ресурсов
После вызова ф-ции: var imgData = canvas.toDataURL(); или отрисовки одного канваса в другой...

HttpWebRequest, расход памяти непомерно больших объемов и , как следствие, утечка памяти
Добрый вечер. Мне была поставлена такая задача. Написать приложение, которая загружает из списка...

Вектор, утечка памяти, функция создания и выделение памяти
Здравствуйте. Есть проблема. функция malloc выделяет память лишь в функции CreateVector(), и при...

Загрузка или использование TBitmap из памяти
Дорогие, неполучаетса у меня использовать этот SDK -...

Утечка памяти
Доброго времени суток, форумчане. Помогите справиться с утечкой памяти, не понятно где зараза...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru