![]() |
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 |
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.
|
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 ?
|
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 ![]() Ist irgendwie gefühlt sauberer. |
AW: Threads Organisieren ?
Funktioniert Danke :)
|
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; |
AW: Threads Organisieren ?
Zitat:
Wenn gleichzeitig ein anderer Thread die Liste durchläuft, während terminierende Threads sich daraus entfernen, kann es zu amüsanten Ergebnissen kommen ;) |
AW: Threads Organisieren ?
Zitat:
|
AW: Threads Organisieren ?
Zitat:
|
AW: Threads Organisieren ?
Zitat:
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 10:47 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 by Thomas Breitkreuz