Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Synchronisation zwischen Threads beim beenden


Flamefire - Do 27.01.11 13:34
Titel: Synchronisation zwischen Threads beim beenden
Ich habe eine Klasse, die Dateien aus dem Internet laden soll. Und da gleich mehrere gleichzeitig.
Dazu hat die Klasse ein Array von Threads, in das die gerade aktiven Threads eingetragen werden. Dire restlichen Einträge sind zur Erkennung auf Nil gesetzt.
Jetzt funktioniert das ganze so:
Anfrage kommt-->Wird in Warteschlange aufgenommen
CriticalSection{
Prüfe ob Thread frei (Also array eintrag mit nil)
Wenn ja, starte neuen Thread mit verweis auf Self (-->Owner) und speichere den Thread im Array
}

Thread hat fertig geladen:
Rufe Methode "BinFertig" von Owner-Klasse auf:
CriticalSection{
Verarbeite Daten
Lösche Thread aus array (:=nil)
}
Thread beendet sich und wird durch FreeOnTerminate freigegeben.

Problem ist jetzt: Wie kümmere ich mich beim Beenden des Programms/Löschen der Hauptklasse darum, dass die Threads alle beendet werden und nicht mehr die Hauptklasse aufrufen?
Sobald ich erst in die CriticalSection gehe, um durch die Threads zu iterieren, kriege ich ja ein Deadlock, wenn ich dort auf die Threads warte. Ein Problem gibt es da auch, wenn ein thread direkt danach fertig wird und somit vor der Criticalsection in der Hauptklasse steht.

Wie löse ich das Problem?


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Do 27.01.2011 um 15:08


bummi - Do 27.01.11 14:22

Ohne CS über die Threads iterieren und eine Property zum beenden setzen der Getter/Setter verfügt über eine Threadprivate CS ?


haentschman - Do 27.01.11 18:14

Hallo...

einen Lösungsweg findest du in der DP http://www.delphipraxis.net/157369-mehrere-threads-sauber-beenden.html
kurz zusammengefaßt:
- kein FreeOnTerminate = True
- Liste der Threads mitführen
- ! über Message mitteilen, daß der Thread beendet ist.

:wave: