powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Утечки памяти в компоненте xlReport при компиляции с помощью Delphi XE4
10 сообщений из 10, страница 1 из 1
Утечки памяти в компоненте xlReport при компиляции с помощью Delphi XE4
    #38803369
AsusMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет!
Кто использует компоненты xlReport и Delphi XE4-XE7?

Помогите с проблемой утечки памяти в компоненте xlReport при компиляции с помощью Delphi XE4 (32/64),
при компиляции того же кода в D7 проблемы не возникает.

У меня утекает память ~ 10% от объема данных. Удобно наблюдать в утилите procexp.

Утечки наблюдал в :
ProcExp , madExpert, FastMM4 - не видят утечек,
AQTime 8 видит утечки, но номера строки не дает (демо и std)

Память утекает в модуле xlEngine в этом цикле:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
while not XLDataSet.Eof do begin
(FBuff as TxlBuffer).GetRecord(Self, FRows);
FRecordCount := FRecordCount + 1;
{$IFDEF XLR_VCL}
(Report as TxlReport).DoOnProgress2(Self as TxlDataSource, FRecordCount);
{$ENDIF}
{$IFDEF XLR_TRIAL}
{$I xlDoRestrict5.inc}
{$ENDIF}
XLDataSet.Next;
Report.CheckBreak;
end;



Если закомментарить строку в function TxlVarBuffer.CheckLimits:

IRange.Value := Formulas;

то утечка прекращается...почти.
...
Рейтинг: 0 / 0
Утечки памяти в компоненте xlReport при компиляции с помощью Delphi XE4
    #38803610
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AsusManIRange.Value := Formulas;Осталось типы назвать
...
Рейтинг: 0 / 0
Утечки памяти в компоненте xlReport при компиляции с помощью Delphi XE4
    #38803612
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_ОсталосьИ области видимости
...
Рейтинг: 0 / 0
Утечки памяти в компоненте xlReport при компиляции с помощью Delphi XE4
    #38803652
AsusMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,


1. IRange: IxlRange;

IxlRange = Excel8G2.Range;

Тип OLEVariant, видимость локальная.

2. Formulas: OLEVariant;

3. TxlVarBuffer = class(TxlBuffer)
private
FBuff: OLEVariant;

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
function TxlVarBuffer.CheckLimits(const Immediately: boolean; Source: TxlExcelDataSource): boolean;
var
  IRange: IxlRange;
  Formulas: OLEVariant;
  i, j: integer ;
begin
  Result := (RowCount >= xlrMaxVarRowCount) or Immediately;
  if Assigned(Source) and Result and (RowCount > 0) and (not _VarIsEmpty(FBuff)) then begin
    if Source.RangeType <> rtRange then
      IRange := InsertBlankRows(Root.IRange.Rows.Count, RowCount, Root.ColCount, Root.ITempSheet, Root.IRange)
    else begin
      IRange := InsertBlankRows2(Root.IRange.Rows.Count, RowCount, Root.ColCount, Root.ITempSheet, Root.IRange, Source.FIUnMergedRows);
    Formulas := VarArrayCreate([1, RowCount, 1, Root.ColCount], varVariant);
    for i := 1 to RowCount do
      for j := 1 to Root.ColCount do
        Formulas[i, j] := FBuff[j, i];
        //IRange.Cells.Item[i, j].Value  := FBuff[j, i]; //лучше но медленно

    IRange.Value := Formulas; // replace IRange.Formula := Formulas (rc1)

    if not Immediately then
      StartBuffer;
  end;
end;

procedure TxlVarBuffer.StartBuffer;
begin
  FBuff := VarArrayCreate([1, Root.ColCount, 1, 1], varVariant)
end;
...
Рейтинг: 0 / 0
Утечки памяти в компоненте xlReport при компиляции с помощью Delphi XE4
    #38824081
AsusMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AsusMan,

Решил проблему, тема закрыта.
...
Рейтинг: 0 / 0
Утечки памяти в компоненте xlReport при компиляции с помощью Delphi XE4
    #38824208
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AsusManРешил проблему, тема закрыта.Полностью одобряю подход. Пусть остальные тоже помучаются
...
Рейтинг: 0 / 0
Утечки памяти в компоненте xlReport при компиляции с помощью Delphi XE4
    #38824578
AsusMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_AsusManРешил проблему, тема закрыта.Полностью одобряю подход. Пусть остальные тоже помучаются

Если конкретно по утечке, заменил тип:

Код: pascal
1.
2.
3.
4.
5.
function TxlVarBuffer.CheckLimits(const Immediately: boolean; Source: TxlExcelDataSource): boolean;
var
  //IRange: IxlRange;
  IRange: Variant;
...



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

А так - компоненты мне нравятся, увеличил вариантный буфер с 256 до 2048 для скорости и переделал распределение
памяти - VarArrayRedim(FBuff, RowCount); чтобы не вызывалось для каждой записи, т.е. сразу выделяю весь буфер.

DDE и CSV - не использую, т.к. с Excel 2010 ведут себя нестабильно, особенно в виде сервиса и на серверных ОС, на ядре XP вообще ошибки пачками валяться - Error: System call failed

Иногда на вариантном массиве Excel 2010 выдает такую ошибку, особенно если процессор занят другими процессами на 100%, на Excel 2003 такого не наблюдалось.
Если кто знает как избавится от ошибок Error: System call failed - просьба откликнуться, как с ними бороться?
...
Рейтинг: 0 / 0
Утечки памяти в компоненте xlReport при компиляции с помощью Delphi XE4
    #38830759
AsusMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторИногда на вариантном массиве Excel 2010 выдает такую ошибку, особенно если процессор занят другими процессами на 100%, на Excel 2003 такого не наблюдалось.
Если кто знает как избавится от ошибок Error: System call failed - просьба откликнуться, как с ними бороться?

Ошибся малость, после длительных испытаний пришел к выводу, что ошибка " System call failed " почти 100% начинается, когда система начинает активный страничный обмен. т.е. когда несколько активных процессов конкурируют за физическую память.
Еще полезным бывает сделать паузу 1-2 секунды перед закрытием Excel или сохранением в файл.

Все это касается не только данных компонент но и всех программ которые используют COM для работы с Excel 2007 / 2010.

С Excel 2003 такая ошибка возникала крайне редко,
хотя в нем было естественно ограничение на количество строк на листе.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Утечки памяти в компоненте xlReport при компиляции с помощью Delphi XE4
    #39663183
AsusMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может кому то еще надо:

Если компоненты применяются в сервисе Windows и при использовании антивируса ESET возможна ошибка:

System call failed

Тогда в процедуре:

procedure TxlExcelDataSource.PutRange;

...После

VBACopyFormats(Self, FRows, FHeights, FDeleteSpecialRow, xrgoPreserveRowHeight in Options, xroHideExcel in Report.Options);

... надо поставить задержку в 2 секунды -

sleep(2000);
...
Рейтинг: 0 / 0
Утечки памяти в компоненте xlReport при компиляции с помощью Delphi XE4
    #39663263
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Антивирусы - зло. В очередной раз убеждаюсь. Решение не очень. Как вообще в жизни?
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Утечки памяти в компоненте xlReport при компиляции с помощью Delphi XE4
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]