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
Narses: Topic aus Sonstiges (Delphi) verschoben am Do 27.01.2011 um 15:08