Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Утечка памяти при печати  [new]
SHS_SHS
Member

Откуда:
Сообщений: 139
Доброго времени суток.
При печати через канву принтера куда-то девается память. И при большом количестве документов выдает ошибку что мол закончилась память. Может не выдать ошибку, а просто печать пустые листы.
Упрощенный код такой:
 
  aImage := PicStreamToBmp(aImageStream);
  Printer.PrinterIndex := GetIndexPrinterByName(aPrinterName);
  Printer.BeginDoc;
  try
    Printer.Canvas.StretchDraw(R, aImage);
  finally
    Printer.EndDoc;
    Printer.PrinterIndex := -1;
    aImage.Free;
  end;

Тот же код, только с логом:
 
  LogMsg('1 - ' + GetMemoryUseProgram);  
  aImage := PicStreamToBmp(aImageStream);
  LogMsg('2 - ' + GetMemoryUseProgram);  
  Printer.PrinterIndex := GetIndexPrinterByName(aPrinterName);
  Printer.BeginDoc;
  try
    LogMsg('3 - ' + GetMemoryUseProgram);  
    Printer.Canvas.StretchDraw(R, aImage);
    LogMsg('4 - ' + GetMemoryUseProgram);
  finally
    Printer.EndDoc;
    Printer.PrinterIndex := -1;
    LogMsg('5 - ' + GetMemoryUseProgram);
    aImage.Free;
    LogMsg('6 - ' + GetMemoryUseProgram);
  end;


1 - 36728 KB
2 - 45804 KB - + ~9м Bitmap.LoadFrom..
3 - 46240 KB
4 - 55144 KB - + ~9м нарисовали на канве принтера
5 - 54984 KB
6 - 46092 KB - - ~9м Bitmap.Free

Подскажите как освободить память занятую при печати? А то не очень удобно следить за памятью и перезапускать программу.
30 мар 21, 12:52    [22301971]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при печати  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

Она сама освободится когда принтер наконец-то напечатает то, что ты ему послал.

Posted via ActualForum NNTP Server 1.5

30 мар 21, 13:11    [22301982]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при печати  [new]
SHS_SHS
Member

Откуда:
Сообщений: 139
Память освобождается только после перезапуска программы. До печати программа в памяти занимает около 20-30мб, после печати - 1,5 - 2гб. И после завершения печати и через час после завершения печати не освобождается.
30 мар 21, 13:19    [22301985]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при печати  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

А здесь показано только 9 мб. Значит память течёт где-то в другом месте. FastMM +
FullDebugMode тебе в руки или хотя бы включи рапорт об утечках встроенного менеджера.

Posted via ActualForum NNTP Server 1.5

30 мар 21, 13:22    [22301991]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при печати  [new]
SHS_SHS
Member

Откуда:
Сообщений: 139
Показано только 9мб, т.к. код в процедуре, а процедура в цикле.
Если закомментить
Printer.Canvas.StretchDraw(R, aImage);
, то утечек нет.
30 мар 21, 13:51    [22302006]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при печати  [new]
SHS_SHS
Member

Откуда:
Сообщений: 139
А еще утечек нет, если выключить принтер )))
30 мар 21, 13:55    [22302009]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при печати  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

Это ничего не меняет на предыдущем ответе. ReportMemoryLeaksOnShutdown и FullDebugMode
тебе в руки.

Posted via ActualForum NNTP Server 1.5

30 мар 21, 13:57    [22302011]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при печати  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 15181
SHS_SHS
 aImage := PicStreamToBmp(aImageStream);


а aImageStream точно где-то освобождается?
30 мар 21, 14:19    [22302024]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при печати  [new]
SHS_SHS
Member

Откуда:
Сообщений: 139
X11
SHS_SHS
 aImage := PicStreamToBmp(aImageStream);


а aImageStream точно где-то освобождается?

Если бы было так все просто )
      aImageStream := TMemoryStream.Create;
      try
        ExecQueryStream('....', MainDatabaseReports, nil, aImageStream, True);
        aImageStream.Position := 0;
        PrintImage(aImageStream); // процедура печати код, которой указан выше
      finally
        aImageStream.Free;
      end;


Эврикал написал, что все нормально, 96кб утечки.
Memory Leak: Total size=96316 - Count=1022.
30 мар 21, 14:36    [22302040]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при печати  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

Убери выбор принтера из процедуры.

Posted via ActualForum NNTP Server 1.5

30 мар 21, 14:42    [22302046]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при печати  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 27064
Попробуй перед каждой печатью создавать свой принтер и после каждой печати уничтожать его.
31 мар 21, 09:22    [22302341]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить