Конференция "Corba" » как вернуть ресурсы после создания COM-объекта [Delphi, Windows]
 
  • JohnnyRaw (21.09.06 00:40) [0]
    скопировал свой вопрос из раздела "основная" т.к. это больше сюда относится, наверное.

    Ситуация такая:
    При каждом последуещем запуске процедуры, количество используемой приложением памяти увеличивается (при слежении в windows task manager: немного в '+', немного в '-', но в целом стабильно растет), потом, через n-количество выполнения этой процедуры, приложение начинает очень сильно тормозить...

    Опыт с memproof показал след. результаты:
    после троекратного выполнения процедуры и выхода из программы лог такой

        386  Live Pointer          03881F54         28  
        387  Critical Section      03881F58          0  InitializeCriticalSection
      17551  Error                 000001E7          0  VirtualAlloc(03980000,1048576,8192,4) : Attempt to access invalid addr
      17552  Error                 000001E7          0  VirtualAlloc(03980000,65536,8192,4) : Attempt to access invalid addres
      26016  Error                 000001E7          0  VirtualAlloc(048C0000,1048576,8192,4) : Attempt to access invalid addr
      26017  Error                 000001E7          0  VirtualAlloc(048C0000,65536,8192,4) : Attempt to access invalid addres
      38791  SysString             055F004C     140564  SysAllocStringLen(,140564)
     107491  SysString             06C3F3FC     140564  SysAllocStringLen(,140564)
     175529  SysString             06C3FFC4     140564  SysAllocStringLen(,140564)

    подозрение вызывают особенно 3 последние строчки, но ума не приложу откуда ноги растут.

    в процедуре создаю следующее:

    Log:=TStringList.Create;
    cfProg:=TIniFile.Create('C:\...\Delphi7\Projects\config.ini');
    v:=VarArrayCreate([0,0], VarVariant);
    List:=TStringList.Create;
    Idoc:=CreateComObject(Class_HTMLDOcument) as IHTMLDocument2;
    m: Array of Array of String;


    память от них освобождаю так:

    IDoc:=nil;
    VarClear(v);
    cfProg.Free;
    Finalize(m);
    FreeAndNil(Log);
    FreeAndNil(List);


    заранее спасибо за любое участие

    <Цитата>

    --------------------------------------------------------------------------------
    Правильный Вася   (20.09.06 19:00) [1]
    If the interface returned by CreateCOMObject is assigned to a Variant, you can release the interface by assigning the Unassigned constant to that Variant.

    IDoc:=nil;
    ку?

    <Цитата>

    --------------------------------------------------------------------------------
    JohnnyRaw   (20.09.06 20:30) [2]
    не, чето не ку (
    IDoc: IHTMLDocument2;

    <Цитата>

    --------------------------------------------------------------------------------
    Правильный Вася   (20.09.06 21:07) [3]
    > m: Array of Array of String;
    а вложенные очичаешь?

    <Цитата>

    --------------------------------------------------------------------------------
    JohnnyRaw   (20.09.06 21:07) [4]
    вот конкретный пример кода:

    uses
    .....
    ComObj, ActiveX;
    procedure hiddenleak;
    var
     IDoc: IHTMLDocument2;
     v: Variant;
     HTML: String;
    begin
     HTML:=Form1.IdHttp1.Get('http://localhost/01.html');
     Idoc:=CreateComObject(Class_HTMLDOcument) as IHTMLDocument2;
     v:=VarArrayCreate([0,0], VarVariant);
     v[0]:= MarHTML;
     IDoc.write(PSafeArray(System.TVarData(v).VArray));
     IDoc:=nil;
     VarClear(v);
    end;

    выполняется с десяток циклов - плюс еще мегабайт памяти, как освобождать - absolutely no idea

    <Цитата>

    --------------------------------------------------------------------------------
    guav ©   (20.09.06 21:29) [5]

    > IDoc:=nil;

    Это не надо, оно и само делается.

    > VarClear(v);

    Это тоже.

    > Finalize(m);

    А это вообще лучше убрать.
    Может в этом и ошибка, если для явного Finalize генерируется не-вложенная финализация.

    <Цитата>

    --------------------------------------------------------------------------------
    JohnnyRaw   (20.09.06 21:48) [6]
    все убрал осталось лишь:

    begin
     HTML:=Form1.IdHttp1.Get('http://localhost/01.html');
     Idoc:=CreateComObject(Class_HTMLDOcument) as IHTMLDocument2;
     v:=VarArrayCreate([0,0], VarVariant);
     v[0]:= MarHTML;
     IDoc.write(PSafeArray(System.TVarData(v).VArray));
    end;

    результат нулевой
    после десятикратного выполнения процедуры лог от memproof такой:

       404  Live Pointer          02412090         28  
          00000069   C:\Program Files\Borland\Delphi7\Projects\Project1.exe
          00403C6E   C:\Program Files\Borland\Delphi7\Projects\Project1.exe
          7C816D4A RegisterWaitForInputIdle  C:\WINDOWS\system32\kernel32.dll
        405  Critical Section      02412094          0  InitializeCriticalSection
          0042B20B   C:\Program Files\Borland\Delphi7\Projects\Project1.exe
          00403C6E   C:\Program Files\Borland\Delphi7\Projects\Project1.exe
          7C816D4A RegisterWaitForInputIdle  C:\WINDOWS\system32\kernel32.dll
       2379  SysString             001DDA54     140564  SysAllocStringLen(,140564)
       4051  SysString             044A2704     140564  SysAllocStringLen(,140564)
       7801  SysString             0445DCBC     140564  SysAllocStringLen(,140564)
       9598  SysString             045B56A4     140564  SysAllocStringLen(,140564)
      11248  SysString             045FA05C     140564  SysAllocStringLen(,140564)
      12844  SysString             045FA05C     140564  SysAllocStringLen(,140564)
      14409  SysString             051E004C     140564  SysAllocStringLen(,140564)
      15961  SysString             05225A14     140564  SysAllocStringLen(,140564)
      17476  SysString             0526A43C     140564  SysAllocStringLen(,140564)
      19052  SysString             0526A43C     140564  SysAllocStringLen(,140564)

    это что по ~140 K за один цикл утекает?
    где-то такие же результаты дает наблюдение за TaskManager'ом

    <Цитата>

    --------------------------------------------------------------------------------
    guav ©   (20.09.06 21:59) [7]
    > System.TVarData(v).VArray

    VarArrayAsPSafeArray ?
 
Конференция "Corba" » как вернуть ресурсы после создания COM-объекта [Delphi, Windows]
Есть новые Нет новых   [134431   +10][b:0][p:0]