Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Prüfen ob Thread noch existiert


>M@steR< - So 07.10.12 16:51
Titel: Prüfen ob Thread noch existiert
Gelöscht


jaenicke - So 07.10.12 17:26

Es gibt nur zwei Möglichkeiten:
Entweder FreeOnTerminate oder eine externe Variable, die noch auf das Threadobjekt zugreift. Beides geht nicht, da du nie weißt wann der Pointer durch die Freigabe schon ungültig ist.

Was stattdessen sinnvoll ist, lässt sich so nicht sagen, dafür müsstest du genauer erklären was du damit bezweckst. Eine Möglichkeit wäre das Event OnTerminate des Threads zu benutzen.


>M@steR< - So 07.10.12 17:52

Gelöscht


Narses - So 07.10.12 18:05

Moin!

Wie user profile iconjaenicke schon vorgeschlagen hat, dürfte die einfachste Version sein:Damit sind nur Threads in der Liste, die noch "leben". :idea:

cu
Narses


haentschman - So 07.10.12 18:28

Zitat:
Was ich erreichen möchte ist, dass ich den Thread durch klicken auf einen Button Pausieren / Resumen kann.

... aber nicht mit Suspend und Resume sondern über eine Flagvariable des Threads die von außen gesetzt wird und damit der abzuarbeitende Code übersprungen wird. Der Thread läuft zwar aber tut nix. Suspend und Resume kann manchmal komische Effekte hervorrufen weil man den Thread nicht zu einem definierten Zustand anhällt. Siehe hier: http://www.delphipraxis.net/166260-thread-suspend-und-resume-deprecated.html


jaenicke - So 07.10.12 20:35

Ich werfe mal noch die Stichwörter Threadpool und Workerthread in den Raum. ;-)

Da gibt es drüben in der Delphipraxis auch umfangreiche Implementierungen, die du einfach benutzen kannst, z.B. diese:
http://www.delphipraxis.net/156768-threadpool-1-0-9-fuer-delphi-2010-xe.html
(auf Anhieb die gefunden, da gab es aber auch andere...)


>M@steR< - So 07.10.12 20:47

Gelöscht


jaenicke - Mo 08.10.12 05:35

Statt einer reinen Flagvariablen kann man auch mit Events arbeiten. Das lässt sich prinzipiell genauso verwenden, aber ist threadsicher und man kann gezielt darauf warten, der Thread muss also nicht pollen. Zudem kann man allen Threads noch ein weiteres Event verpassen, mit dem alle abgebrochen werden (z.B. Programmende).
Stichworte: CreateEvent, SetEvent, WaitForSingleObject, WaitForMultipleObjects