AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Freigeben von Objekten einer Function

Ein Thema von ScharfeMietze · begonnen am 23. Sep 2018 · letzter Beitrag vom 26. Sep 2018
Antwort Antwort
Seite 1 von 2  1 2      
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#1

Freigeben von Objekten einer Function

  Alt 23. Sep 2018, 12:24
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
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
741 Beiträge
 
#2

AW: Freigeben von Objekten einer Function

  Alt 23. Sep 2018, 13:11
Du erstellst zuerst eine neue Instanz und weist diese Result zu:

Result:= TTGMessage.Create;
Dann weist du Result eine andere Instanz zu:

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.
  Mit Zitat antworten Zitat
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#3

AW: Freigeben von Objekten einer Function

  Alt 23. Sep 2018, 13:49
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?!?
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
741 Beiträge
 
#4

AW: Freigeben von Objekten einer Function

  Alt 23. Sep 2018, 13:52
Letzteres.
  Mit Zitat antworten Zitat
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#5

AW: Freigeben von Objekten einer Function

  Alt 23. Sep 2018, 15:08
Okay thx das erleuchtet mich ^^
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Freigeben von Objekten einer Function

  Alt 23. Sep 2018, 19:19
Schreib in deiner DPR-Datei einfach mal 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.
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Freigeben von Objekten einer Function

  Alt 24. Sep 2018, 11:59
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
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#8

AW: Freigeben von Objekten einer Function

  Alt 25. Sep 2018, 11:36
{ 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
Miniaturansicht angehängter Grafiken
download.png  

Geändert von ScharfeMietze (25. Sep 2018 um 11:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
741 Beiträge
 
#9

AW: Freigeben von Objekten einer Function

  Alt 25. Sep 2018, 11:55
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.
  Mit Zitat antworten Zitat
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#10

AW: Freigeben von Objekten einer Function

  Alt 25. Sep 2018, 20:43
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 ..
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:36 Uhr.
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