![]() |
Freigeben von Objekten einer Function
Delphi-Quellcode:
ich habe ein generische OBjektliste vom Typ TTGMessage , in der sich entweder eine Message oder eine edited_message befindet.(alle sind vom Typ TTGMessage)
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; Aufrufen tu ich sie so
Delphi-Quellcode:
Die Frage ist, was mache ich mit dem erstellten "Result:= TTGMessage.Create;" in TGMessagefnd
for I := 0 to FTGResults.Count-1 do
begin mmo2.Lines.Add(TGMessagefnd.chat.id); end; 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 |
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:
wodurch die zuerst erstellte Instanz in der Luft hängt und nie freigegeben wird.
z.B.: Result:= FTGResults[Index].TGMessage;
=> Lass einfach das create weg, das du scheinbar hier gar nicht brauchst. |
AW: Freigeben von Objekten einer Function
Hmmmm Okay damit ist eine Frage beantwortet aber neue Verständnisfragen tauchen auf.
Delphi-Quellcode:
Was ist nun in dem Result? ein "copie" ausFTGResults[Index].TGMessage; oder ist es das komplette objekt das dann aus FTGResults[Index] verschwindet??
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; oder verweist das Result nur auf FTGResults[Index].TGMessage; und wird beim löschen von FTGResults.free aufgeräumt?!? |
AW: Freigeben von Objekten einer Function
Letzteres.
|
AW: Freigeben von Objekten einer Function
Okay:) thx das erleuchtet mich :):-D ^^
|
AW: Freigeben von Objekten einer Function
Schreib in deiner DPR-Datei einfach mal
Delphi-Quellcode:
dazu. Wenn du dein Programm dann beendest, dann bekommst du eine Liste aller nicht freigegebenen Ressourcen. Wenn keine Meldung kommt, dann ist alles sauber.
ReportMemoryLeaksOnShutdown := True;
Ich würde aber einfach mal behaupten, dass die Meldung da sein wird wenn du dir bis jetzt keine Gedanken darum gemacht hast. :) |
AW: Freigeben von Objekten einer Function
Hi Scharfe Mieze
Zitat:
![]() 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 |
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 |
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. |
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:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz