Es ist eine ganz schlechte Idee, einen Thread per Suspend/Resume zu kontrollieren. Du hast nämlich keinerlei Kontrolle, was der Thread gerade macht.
Viel besser ist es, von außen den Wunsch äußern zu dürfen, das der Thread sich schlafen legt. Der Thread selbst prüft dann an für ihn sicheren Stellen, ob er sich jetzt schlafen legen soll, oder nicht. Beispiel:
Delphi-Quellcode:
Type
TMyThread = Class (TThread)
Private
fSleepRequest : Boolean;
Protected
Procedure Execute; Override;
Public
Procedure GotoSleep();
Procedure WakeUp();
End;
...
Procedure TMyThread.WakeUp();
Begin
fSleepRequest := False;
If Suspended Then Resume;
End;
Procedure TMyThread.GotoSleep();
Begin
fSleepRequest := True;
End;
...
Procedure TMyThread.Execute;
Begin
...
While not Terminated Do Begin
If fSleepRequest Then Begin
fSleepRequest := False;
Suspend;
End;
// <Code, der vollständig ausgeführt werden muss>
End;
...
End;
....
Procedure TForm1.CheckBox1Click (Sender : TObject);
Begin
If CheckBox1.Checked Then // Goto sleep
MyThread.GotoSleep()
else
MyThread.WakeUp();
End;
Sicherheitshalber würde ich noch den Zugriff auf 'fSleepRequest' über eine Critical Section kapseln.
Ich würde mir mal Synchronisationsobjekte anschauen (Semaphoren, Mutexe, Events). Die sind besser geeignet, die Ausführung eines Threads zu kontrollieren.