Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Freigeben von Objekten einer Function (https://www.delphipraxis.net/197967-freigeben-von-objekten-einer-function.html)

ScharfeMietze 23. Sep 2018 11:24

Freigeben von Objekten einer Function
 
Delphi-Quellcode:
function TTGMBot.TGMessagefnd(const Index: Integer): TTGMessage;
begin
  try
    Result:= TTGMessage.Create;

  if Assigned(FTGResults) then
    begin
    if Assigned(FTGResults[Index].TGMessage) then
      begin
        Result:= FTGResults[Index].TGMessage;
        mmo2.Lines.Add('TGMessagefnd' + FTGResults[Index].TGMessage.chat.id);
      end
    else
    if Assigned(FTGResults[Index].edited_message) then
      begin
        Result:= FTGResults[Index].edited_message;
        mmo2.Lines.Add('TGMessagefnd' + FTGResults[Index].edited_message.chat.id);
      end
    else
    if Assigned(FTGResults[Index].channel_post) then
      begin
        Result:= FTGResults[Index].channel_post;
        mmo2.Lines.Add('TGMessagefnd' + FTGResults[Index].channel_post.chat.id);
      end
    else
    if Assigned(FTGResults[Index].edited_channel_post) then
      begin
        Result:= FTGResults[Index].edited_channel_post;
        mmo2.Lines.Add('TGMessagefnd' + FTGResults[I].edited_channel_post.chat.id);
      end;
    end;
  except
     Result.Free;
     raise
  end;
end;
ich habe ein generische OBjektliste vom Typ TTGMessage , in der sich entweder eine Message oder eine edited_message befindet.(alle sind vom Typ TTGMessage)

Aufrufen tu ich sie so
Delphi-Quellcode:
 for I := 0 to FTGResults.Count-1 do
  begin
   mmo2.Lines.Add(TGMessagefnd.chat.id);
  end;
Die Frage ist, was mache ich mit dem erstellten "Result:= TTGMessage.Create;" in TGMessagefnd
muss ich das irgendwann befreien? Oder zerlegt sie sich automatichsch ? Ich hab mir da eigentlich nie drüber gedanken gemacht. Da das Tool aber im Dauereinsatz auf einer "schwachen" Maschine laufen soll würde es mich mal interessieren.


Gruß Mietze

Olli73 23. Sep 2018 12:11

AW: Freigeben von Objekten einer Function
 
Du erstellst zuerst eine neue Instanz und weist diese Result zu:

Delphi-Quellcode:
Result:= TTGMessage.Create;

Dann weist du Result eine andere Instanz zu:

Delphi-Quellcode:
z.B.: Result:= FTGResults[Index].TGMessage;
wodurch die zuerst erstellte Instanz in der Luft hängt und nie freigegeben wird.

=> Lass einfach das create weg, das du scheinbar hier gar nicht brauchst.

ScharfeMietze 23. Sep 2018 12:49

AW: Freigeben von Objekten einer Function
 
Hmmmm Okay damit ist eine Frage beantwortet aber neue Verständnisfragen tauchen auf.

Delphi-Quellcode:
function TTGMBot.TGMessagefnd(const Index: Integer): TTGMessage;
begin
  try

  if Assigned(FTGResults) then
    begin
    if Assigned(FTGResults[Index].TGMessage.chat) then
      begin
        Result:= FTGResults[Index].TGMessage;


end;
Was ist nun in dem Result? ein "copie" ausFTGResults[Index].TGMessage; oder ist es das komplette objekt das dann aus FTGResults[Index] verschwindet??

oder verweist das Result nur auf FTGResults[Index].TGMessage; und wird beim löschen von FTGResults.free aufgeräumt?!?

Olli73 23. Sep 2018 12:52

AW: Freigeben von Objekten einer Function
 
Letzteres.

ScharfeMietze 23. Sep 2018 14:08

AW: Freigeben von Objekten einer Function
 
Okay:) thx das erleuchtet mich :):-D ^^

Aviator 23. Sep 2018 18:19

AW: Freigeben von Objekten einer Function
 
Schreib in deiner DPR-Datei einfach mal
Delphi-Quellcode:
ReportMemoryLeaksOnShutdown := True;
dazu. Wenn du dein Programm dann beendest, dann bekommst du eine Liste aller nicht freigegebenen Ressourcen. Wenn keine Meldung kommt, dann ist alles sauber.

Ich würde aber einfach mal behaupten, dass die Meldung da sein wird wenn du dir bis jetzt keine Gedanken darum gemacht hast. :)

Delbor 24. Sep 2018 10:59

AW: Freigeben von Objekten einer Function
 
Hi Scharfe Mieze
Zitat:

ich habe ein generische OBjektliste vom Typ TTGMessage , in der sich entweder eine Message oder eine edited_message befindet.(alle sind vom Typ TTGMessage)
Objectlisten haben ein Boolean-Property OwnsObjects, mit dem du bestimmen kannst, dass sie sämtliche aufgelisteten Objekte freigibt, wenn sie selbst freigegeben wird.

Aber Vorsicht: Objekte, die sich in der Liste befinden und die beim Erzeugen einem Owner zugewiesen werden, wollen von diesem und allenfalls der Objektliste freigegeben werden.

Gruss
Delbor

ScharfeMietze 25. Sep 2018 10:36

AW: Freigeben von Objekten einer Function
 
Liste der Anhänge anzeigen (Anzahl: 1)
{ The OwnsObjects property is set by default to true -- the list will free the owned objects automatically. }
Genau das ist ja der Hintergedanke.mich eben nicht drum kümmern zu müssen.


Was mir manchmal nicht schlüssig ist wann wer wie welches objekt besitzt und wann es durch OwnsObjects befreit wird ..
Was ist wenn ich das Result der fuction einer weiteren objektliste übergebe? Wer hat dann wann was?

Hintergrund ist der, das später in (verschiedenen) Task je nach Inhalt weiterverarbeitet werden soll. Die Task sollen ihre eigenen Objektlisten haben.

Daher kann eine TGMessage aus den originalen Telegramm results (FTGResults(objekliste)) in weiteren/mehreren Objektlisten auftauchen.
Die Task prüfen Quasi ob ihre Objektliste was enthält und wenn ja arbeiten sie es ab.
So ist bisher mein Plan.

Daher hoffe ich das ihr mir die Frage beantworten könnt wann wer Besitzer des Objekts aus der "Hauptliste" FTGResults (generic Object Liste) ist und wann es wie durch OwnsObjects befreit wird. Wenn es immer FTGResults ist, wäre es einfach da ich diese dann einfach erst befreie wenn alle Task fertig sind.... Mindmap siehe Bild

Olli73 25. Sep 2018 10:55

AW: Freigeben von Objekten einer Function
 
Wenn du die weiteren Listen auch auf OwnsObjects stellst hast du ein Problem, da die erste Liste, die freigegeben wird (oder wenn ein Objekt aus der Liste gelöscht wird) das Objekt löscht und die andere Liste dann ins Leere greift. Es gibt also nicht sowas wie einen (Haupt-)Eigentümer.

Funktionieren würde das nur bei den mobilen OS, dort wird das über Referenzzählung gelöst, erst nach dem Auflösen der letzten Referenz wird freigegeben.

ScharfeMietze 25. Sep 2018 19:43

AW: Freigeben von Objekten einer Function
 
Gut, das ist ja planbar. Da Telegramm max 100 Updates ausspuckt kann es mit einer Referenzzählung versehen werden pro Aufgabe zähle hoch, ist die Aufgabe erledigt ziehe 1 ab ist der Referenzzähler 0 lösche es aus der Hauptliste.
die restlichen listen bekommen ownsobject false.....
dann muss auch nur die Hauptliste permanent bestehen ..


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:55 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz