Hmm.. wenn property Terminated wie in älteren Versionen ReadOnly ist und .Start das scheinbar auch nicht zurücksetzt ist es natürlich keine Lösung - dann kann man den Thread auch freigeben und einen neuen erzeugen.. das Konzept scheint mal wieder sehr gut durchdacht zu sein
Idee:
Delphi-Quellcode:
type
TMyThread =
class(TThread)
private
FHalted: Boolean;
procedure SuspendIfHalted;
public
procedure Halt;
procedure Continue;
end;
procedure TMyThread.Halt;
begin
FHalted := True;
end;
procedure TMyThread.Continue;
begin
FHalted := False;
ResumeThread(
Handle);
end;
procedure TMyThread.SuspendIfHalted;
begin
if FHalted
then
SuspendThread(
Handle);
end;
procedure TMyThread.Execute;
begin
repeat
EntercriticalSection;
..
LeaveCriticalSection;
..
//sichere Warteposition ausserhalb Lock
SuspendIfHalted;
until Terminated;
end;
Zu jedem "Terminate" gehört dann natürlich ein "Continue" um den Thread ggf. aufzuwecken.
Alternativ zu SuspendIfHalted ohne echtes Suspend-/ResumeThread:
while FHalted and not Terminated do Sleep(10);
Grüsse, Dirk