Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Threads Organisieren ? (https://www.delphipraxis.net/163301-threads-organisieren.html)

Blamaster 23. Sep 2011 17:01

Delphi-Version: 7

Threads Organisieren ?
 
Hi,

ich schreibe gerade ein kleines Downloadtool. Jeder Download bekommt einen eigenen Thread.

Nun habe ich im Hauptprogramm eine ObjectList erstellt, in die jeder Thread zur besseren Verwaltung abgelegt wird.

Wird nun ein Download abgebrochen, so wird der Thread mit .terminate abgeschossen und aus der ObjectList gelöscht.

Allerdings habe ich aktuell ein Problem bei Downloads die nicht abgebrochen werden, sondern normal/erfolgreich beendet wurden. Ganz am Ende des threads rufe ich ein Synchronize auf.

Der versuch in diesem letzten Synchronize direkt den Thread aus der ObjectList zu löschen schlug fehl.

Hat jemand eine Idee wie ich das hinbekommen kann, dass ein fertiger Thread sich automatisch aus der ObjectList entfernt ?

Gruß Yannic

BUG 23. Sep 2011 18:25

AW: Threads Organisieren ?
 
"Owned" die Objectlist den Thread? Dann ruft sie nämlich free auf bevor der Thread wirklich beendet ist. Also lieber ownObject auf false setzen und freeOnTerminate des Threads auf true.

Blamaster 23. Sep 2011 18:50

AW: Threads Organisieren ?
 
Wenn die Liste den Thread nicht "Owned" und dieser sich durch FreeOnTerminate beendet und ich anschließend Liste.Count aufrufe. Ist der Thread dann dort noch zu finden, oder verschwindet die Referenz dann auch atomatisch aus der Liste ?

BUG 23. Sep 2011 20:36

AW: Threads Organisieren ?
 
Ich meinte das so: die Liste "besitzt" den Thread nicht, dann kannst du ihn gefahrlos aus der Liste löschen. Nachdem das getan ist, terminiert der Thread und wird wegen FreeOnTerminate aufgeräumt.

Alternativ könntest du bei den selben Einstellungen in onTerminate den Thread aus der Liste löschen.
Ist irgendwie gefühlt sauberer.

Blamaster 23. Sep 2011 22:00

AW: Threads Organisieren ?
 
Funktioniert Danke :)

Sir Rufo 23. Sep 2011 23:55

AW: Threads Organisieren ?
 
Ansonsten kann man das auch schön mit dem Visitor-Pattern lösen.

Delphi-Quellcode:
type
  TMyThread = class( TThread )
    private
      FList : TObjectList;
    public
      procedure AddToList( AList : TObjectList );
      procedure RemoveFromList( AList : TObjectList );
      destructor Destroy; override;
  end;

procedure TMyThread.AddToList( AList : TObjectList );
begin
  AList.Add( Self );
end;

procedure TMyThread.RemoveFromList( AList : TObjectList );
begin
  AList.Remove( Self );
end;

destructor Destroy;
begin
  RemoveFromList( FList );
  inherited;
end;

mjustin 24. Sep 2011 09:06

AW: Threads Organisieren ?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1126356)
Ansonsten kann man das auch schön mit dem Visitor-Pattern lösen.


Wenn gleichzeitig ein anderer Thread die Liste durchläuft, während terminierende Threads sich daraus entfernen, kann es zu amüsanten Ergebnissen kommen ;)

Sir Rufo 24. Sep 2011 09:20

AW: Threads Organisieren ?
 
Zitat:

Zitat von mjustin (Beitrag 1126380)
Zitat:

Zitat von Sir Rufo (Beitrag 1126356)
Ansonsten kann man das auch schön mit dem Visitor-Pattern lösen.

Wenn gleichzeitig ein anderer Thread die Liste durchläuft, während terminierende Threads sich daraus entfernen, kann es zu amüsanten Ergebnissen kommen ;)

Das Destroy wird aber nicht mehr im ThreadKontext ausgeführt ;)

mjustin 24. Sep 2011 09:29

AW: Threads Organisieren ?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1126381)
Zitat:

Zitat von mjustin (Beitrag 1126380)
Zitat:

Zitat von Sir Rufo (Beitrag 1126356)
Ansonsten kann man das auch schön mit dem Visitor-Pattern lösen.

Wenn gleichzeitig ein anderer Thread die Liste durchläuft, während terminierende Threads sich daraus entfernen, kann es zu amüsanten Ergebnissen kommen ;)

Das Destroy wird aber nicht mehr im ThreadKontext ausgeführt ;)

Macht es denn einen Unterschied, in welchem Kontext das Destroy ausgeführt wird? Effektiv ist es eine Veränderung der Liste, während andere Threads auf diese zugreifen können, z.B. über die Elemente iterieren.

BUG 24. Sep 2011 11:37

AW: Threads Organisieren ?
 
Zitat:

Zitat von mjustin (Beitrag 1126383)
Effektiv ist es eine Veränderung der Liste, während andere Threads auf diese zugreifen können, z.B. über die Elemente iterieren.

Nö, das ist das eine Liste mit Threads, in die sie sich (im Kontext des MainThreads, ohne Unterbrechung von Code ~> sicher für MainThread) ein- oder austragen und sie sonst nicht anfassen.
Alle Zugriffe sind unterbrechungsfrei und finden hintereinander statt. Was soll da schon schief gehen :freak:

Wenn da jetzt noch andere Threads herumpfuschen, wird es natürlich interessant :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:04 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