Im OnClick, mit dem du den Thread sauber abschießen willst, könnte das so aussehen:
Delphi-Quellcode:
[...]
myThread.Terminate;
myThread.WaitFor;
FreeAndNil(myThread);
[...]
Also:
- "Terminate" sagt dem Thread, dass er beendet werden soll. Dadurch wird auch das "EventWait" ausgelöst, bevor die eigentliche Wartezeit abgelaufen ist (denn genau das haben wir ja extra ins Terminate reingeschrieben)
- WaitFor wartet dann, bis der Thread sich selbst auch wirklich erledigt hat.
- Und wenn der Thread dann wirklich gestoppt ist, wird das Objekt freigegeben.
Alternativ könntest du natürlich auch dieses "FreeOnTerminate" auf "true" setzen (will heißen: hier in dem Code ging ich davon aus, dass es "false" ist). Kommt wohl letztlich darauf an, ob du bei/nach dem Beenden des Threads wissen willst, ob er auch wirklich beendet ist. Mit obiger Methode bekommst du das dann sicher mit und kannst dich im weiteren Programm darauf verlassen, dass der Thread nicht mehr läuft (oder auch dann dem Benutzer die Meldung ausgeben: "Thread wurde beendet").
Bis denn
Bommel
Edit: Noch vergissen: Besonders wichtig ist natürlich bei dem Ganzen auch die Prüfung auf das "terminated" in der while-Schleife in der Procedure "Execute". Nur dadurch wird dann im Execute auch gemerkt, dass sich der Thread beenden will. Letztlich das gleiche wie dein "weiter", nur halt mit den Bord-Mitteln, die ein Thread eh schon dabei hat.