So ist es richtig und ausreichend:
(Ich habe mir erlaubt aus
MyEvent
ein
FMyEvent
um zu verdeutlichen, dass es sich um ein Feld der Klasse handelt)
Delphi-Quellcode:
procedure TMyThread.TerminatedSet;
begin
inherited;
FMyEvent.SetEvent; // auf jeden Fall auch NACH INHERITED!!!!
end;
Procedure TMyThread.Execute;
begin
While not Terminated do
begin
FMyEvent.WaitFor(infinite);
if not(Terminated) then
begin
// Mach was schlaues...
end;
end;
end;
Destructor TMyThread.destroy;
begin
Inherited;
FMyEvent.Free; // NACH INHERITED!!!!!!
end;
Wen man wissen möchte, warum das reicht, dann schaut man sich den Source von
TThread.Destroy
einfach mal an (so habe ich auch herausgefunden, warum das so ausreicht) und sieht dort folgende lustige Dinge:
Delphi-Quellcode:
destructor TThread.Destroy;
begin
if (FThreadID <> 0) and not FFinished and not FExternalThread then
begin
Terminate;
if FCreateSuspended or FSuspended then
Resume;
{$IFDEF MSWINDOWS}
while not FStarted do
{$ELSE}
while not ((not FCreateSuspended or FInitialSuspendDone) and FStarted) do
{$ENDIF}
Yield;
WaitFor;
end;
...
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)