AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) TThreadList leeren und alle Objekte freigeben?

TThreadList leeren und alle Objekte freigeben?

Ein Thema von uups · begonnen am 7. Feb 2017 · letzter Beitrag vom 8. Feb 2017
Antwort Antwort
Seite 1 von 2  1 2   
uups

Registriert seit: 23. Aug 2004
68 Beiträge
 
#1

TThreadList leeren und alle Objekte freigeben?

  Alt 7. Feb 2017, 11:14
Hallo,

ich habe eine TThreadList, der pro Sekunde bis zu 300 Items hinzugefügt werden. Dementsprechend hoch kann auch die Zahl der Items in der Liste sein, wenn diese länger nicht geleert wird. Die Liste zu leeren sollte an sich kein großes Problem sein. Aber wie gebe ich dabei die Objekte frei, die in von Liste verwaltet werden?

Darf ich bei einer sehr langen Liste, die geleert werden muss, die Objekte in einer Schleife innerhalb des geloockten Bereichts freigeben?

Ich meine, bei einer so großen Zahl der neuen Objekte, die hinzufügt werden müssen, sollte die Liste nicht so lange blockiert werden, oder? Anderseits, sehe ich keine andere Möglichkeit, dies zu vermeiden, da ich auf die Objekte in der Liste sowieso erst zugreifen kann, wenn diese blockiert ist.

Wie würdet Ihr vorgehen? Was wäredie schnellste und perfomanteste Methode, eine TThreadList zu leeren und alle Objekte freizugeben?

So etwa habe ich mir das vorgestellt:

Delphi-Quellcode:
procedure TImmObjects.Clear;
var
  List: TList;
  i: integer;
begin
  List := TImmList.LockList;
  try
    for i := 0 to List.Count - 1 do
    begin
      if Assigned(List.Item[i]) then
      TImmObject(List.Item[i]).Free;
    end;
    List.Clear;
  finally
    TImmList.UnlockList;
  end;
end;
In diesem Fall bleibt die Liste über eine längere Zeit blockiert. Ob das so in Ordnung ist?
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.275 Beiträge
 
Delphi 12 Athens
 
#2

AW: TThreadList leeren und alle Objekte freigeben?

  Alt 7. Feb 2017, 11:42
Hallöle...

Im Prinzip kannst du das so machen. Ich würde aber die Schleife andersherum laufen lassen oder mit repeat until und Delete/Free bis List.Count = 0...
Delphi-Quellcode:
procedure TImmObjects.Clear;
var
  List: TList;
  i: integer;
begin
  List := TImmList.LockList;
  try
    for i := List.Count - 1 downto 0 do
    begin
      if Assigned(List.Item[i]) then
      TImmObject(List.Item[i]).Free;
    end;
    List.Clear;
  finally
    TImmList.UnlockList;
  end;
end;
...jeder wie er mag.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: TThreadList leeren und alle Objekte freigeben?

  Alt 7. Feb 2017, 12:13
Du könntest auch mit mehreren Listen arbeiten und eine bestimmte Anzahl Einträge puffern.

Liste erstellen, bis 10.000 Einträge füllen und die Liste einer Abarbeitungsliste hinzufügen.
In einem anderen Thread könnten diese Puffer nach und nach verarbeitet und dann gelöscht werden.
So würde Dein Eingangsthread kaum blockiert werden.

Ein Ringpuffer wäre auch denkbar, wenn Du sicher bist, dass Du da in keinen Überlauf kommst.

Letztlich musst Du genauer untersuchen/erklären, welche zeitlichen Abläufe und Objektmengen Du genau hast...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
uups

Registriert seit: 23. Aug 2004
68 Beiträge
 
#4

AW: TThreadList leeren und alle Objekte freigeben?

  Alt 7. Feb 2017, 12:19
Vielen Dank für die schnelle Reaktion!

Die Schleife rückwärts laufen zu lassen ist eine gute Idee. Danke!
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.123 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: TThreadList leeren und alle Objekte freigeben?

  Alt 7. Feb 2017, 12:23
Vielen Dank für die schnelle Reaktion!

Die Schleife rückwärts laufen zu lassen ist eine gute Idee. Danke!
Das hat aber "nur" etwas mit der Speicherverwaltung zu tun...

Der Vorschlag mit den 2 Listen ist sicherlich eine gute Idee...

Ich hätte das auch über getrennte ThreadedQueues gemacht...

Mavarik
  Mit Zitat antworten Zitat
uups

Registriert seit: 23. Aug 2004
68 Beiträge
 
#6

AW: TThreadList leeren und alle Objekte freigeben?

  Alt 7. Feb 2017, 12:26
Du könntest auch mit mehreren Listen arbeiten und eine bestimmte Anzahl Einträge puffern.

Liste erstellen, bis 10.000 Einträge füllen und die Liste einer Abarbeitungsliste hinzufügen.
In einem anderen Thread könnten diese Puffer nach und nach verarbeitet und dann gelöscht werden.
So würde Dein Eingangsthread kaum blockiert werden.

Ein Ringpuffer wäre auch denkbar, wenn Du sicher bist, dass Du da in keinen Überlauf kommst.

Letztlich musst Du genauer untersuchen/erklären, welche zeitlichen Abläufe und Objektmengen Du genau hast...
Interessant, das muss ich jetzt probieren
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#7

AW: TThreadList leeren und alle Objekte freigeben?

  Alt 7. Feb 2017, 13:25
Leider wurde TThreadList schlampig programmiert, denn man kommt nicht ans TList.Notify ran ... sonst hätte man da eine "ordentliche" TObjektThreadList daraus machen können, welche auf OwnsObject=True eingestellt wird.

Es klingt ja fast danach, als wenn für dich eine Queue besser wäre, als eine Liste.


Leider ist Delphi da ebenfalls schlecht ausgestattet.
Es gibt eine TList, eine TObjectList und eine TThreadList, aber keine TObjectThreadList (und bei der kann kein Free ins Notify eingebaut werden)
Es gibt auch eine TList<T>, eine TObjectList<T>, eine TQueue<T>, eine TObjectQueue und eine TThreadedQueue<T>, aber auch hier fehlt die Möglichkeit der Speicherverwaltung/Objektfreigabe.

OK, man kann auch einfach Windows, Linux und OSX vergessen und verwendet Delphi nur noch für Android und iOS, denn mit ARC werden all diese Bugs umgangen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.882 Beiträge
 
Delphi 12 Athens
 
#8

AW: TThreadList leeren und alle Objekte freigeben?

  Alt 7. Feb 2017, 19:54
Wäre da ein TThreadPool nicht angebrachter ?

Rollo
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#9

AW: TThreadList leeren und alle Objekte freigeben?

  Alt 8. Feb 2017, 00:47
Er hat wohl viele Daten-Objekte, die abgearbeitet werden sollen.

Ein ThreadPool verwaltet Threads, bzw. viele Arbeitsprozeduren, die in mehreren Threads laufen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.882 Beiträge
 
Delphi 12 Athens
 
#10

AW: TThreadList leeren und alle Objekte freigeben?

  Alt 8. Feb 2017, 08:21
Ok, ich dachte er wollte die vielen Daten auch in vielen Threads bearbeiten ...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 16:07 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