Autor Téma: Ducharina, na kterou nemuzu prijit...  (Přečteno 167 krát)

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2588
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Ducharina, na kterou nemuzu prijit...
« kdy: 10-07-2019, 20:11:53 »
Uz jsem z toho magor. Trham tu draty uprostred docela sloziteho procesu, ktery se sklada z nekolika asynchronnich cinnosti, ktere resi jednotlive radice. Existuje master radic a ten nektere ulohy prideluje detskym radicum. Zivotnost radicu se resi pres garbage collector. A kdyz obcas s tim utrzenim dratu vhodne trefim do procesu, ktery tu kaskadu radicu likviduje, tak to vsechno sice funguje, ale nekdy se radic neuvolni, a to i presto, ze kdyz jeho naplanovani k likvidaci protrasuju, tak do interniho seznam TThreadListu se to prida:

Kód: Delphi [Vybrat]
  1. procedure TXxxDispatcher.RegisterGarbage(AInstance: TObject);
  2. var
  3.   list: TList;
  4.   idx: integer;
  5. begin
  6.   list := FGarbageToDispose.LockList;
  7.   try
  8.     idx := list.IndexOf(AInstance);
  9.     if idx < 0 then
  10.       list.Add(AInstance)
  11.     else
  12.       RxLog('%s |!!!!!| %s: DUPLICATE GARBAGE REGISTRATION',
  13.         [StringOfChar(' ', length(TXxxUtils.NowAsString)),
  14.         AInstance.ClassName]);
  15.   finally
  16.     FGarbageToDispose.UnlockList;
  17.   end;
  18. end;
  19.  

A kdyz si dam breakpoint do metody, ktera to nasledne uvolnuje, tak interni seznam je prazdny :-O
Kód: Delphi [Vybrat]
  1. procedure TXxxDispatcher.DisposeGarbage;
  2. var
  3.   list: TList;
  4.   idx: integer;
  5.   obj: TObject;
  6. begin
  7.   list := FGarbageToDispose.LockList;
  8.   try
  9.     for idx := 0 to list.Count - 1 do
  10.     begin
  11.       obj := nil;
  12.       try
  13.         obj := TObject(list[idx]);
  14.         UnregisterController(obj);
  15.         obj.Free;
  16.       except
  17.         on E: Exception do
  18.         begin
  19.           if Assigned(FRxOnLog) then
  20.           begin
  21.           ...
  22.           end
  23.         end;
  24.       end;
  25.     end;
  26.     list.Clear;
  27.   finally
  28.     FGarbageToDispose.UnlockList;
  29.   end;
  30. end;
  31.  

Vubec netusim, kde se ty polozky mohou ztratit, protoze je to singleton a operace nad tim threaded listem s odpadky je par a jsou jednoduche.
Nenapada nekoho neco, co ja nevidim?

A SSCCE po me nechtejte, protoze normalne kdyz tomu netrham draty, tak to spolehlive funguje a kdybych si SSCCE umel udelat, tak se nebudu ptat a chybu napravim sam.
« Poslední změna: 10-07-2019, 20:29:42 od pf1957 »