Guten Morgen,
ich mach das immer so:
Delphi-Quellcode:
...
const
TIMEOUT = 200; //ms
...
//Thread zur Terminierung auffordern
Thrd.Terminate;
while (True) do
begin
//Thread benachrichtigen und warten
WaitResult:= WaitForSingleObject(Thrd.Handle,TIMEOUT);
if WaitResult = WAIT_FAILED then
RaiseLastOSError;
//Thread signalisiert -> Ausgang
if WaitResult = WAIT_OBJECT_0 then
break;
//Application.ProcessMessages;
end;
Thrd.Free;
Wenn man im Hauptthread wartet muss man sicherstellen, dass dieser nicht lange blockiert. Deshalb packe ich das WaitForSingleObject in eine Schleife und warte immer nur kurz. Wenn der Thread benachrichtigt wurde wird die Schleife verlassen. Damit das Ganze funktioniert, muss man sicherstellen, dass das Thread-
Handle auch nach Terminierung noch gueltig
bleibt. Dazu gibt man bei Erzeugung des Threads folgendes an:
Thrd.FreeOnTerminate:= False;
Damit man nicht ewig wartet (falls der Thread in irgendeiner Form in einen Deadlock gelaufen ist), sollte man als Abbruchkriterium
für die Warteschleife vielleicht noch eine maximale Wartezeit vorgeben.
Hoffe ich konnte weiterhelfen.
Schoenen Gruß,
Jens