Autor Beitrag
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Do 27.01.11 13:34 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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 ?

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
haentschman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 285
Erhaltene Danke: 33


DX10 Berlin Professional
BeitragVerfasst: Do 27.01.11 18:14 
Hallo...

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

:wave: