Vous ne devriez jamais appeler suspendre sur un TThread ce ne est pas sûr de le faire et reprendre devrait seulement être utilisé pour démarrer un thread qui a été créé suspendu.
Dans Delphi 2010, la suspension et la reprise, lorsqu'elles ont été dépréciées, et le début de la méthode a été introduit pour renforcer cela.
Pour une explication plus complète, voir ce thread sur les forums Codegears. Après avoir dit qu'il y a 2 façons je vais terminer et libérer un tthread.
1: I Définissez FreeOnTerminate lorsque le thread est créé et que j'appelle simplement.
Thread.Terminate;
2: Libérer le fil explicitement, comme je l'ai besoin de lire le résultat d'une propriété publique avant que le fil est libéré et après avoir mis fin.
Thread.Terminate;
Thread.WaitFor;
//Do somthing like read a public property from thread object
if Thread <> nil then FreeAndNil(Thread);
Dans la boucle principale execute, il peut être une bonne idée de mettre un peu de gestion des exceptions. Ou vous pouvez à se demander pourquoi le fil semble mettre fin à son auto. Cela peut provoquer l'AV si le thread est défini sur FreeOnTerminate et qu'il a déjà été libéré lorsque vous essayez de le libérer.
procedure TThread.Execute;
begin
while not Terminated do
begin
try
//do something
except
on E:Exception do
//handle the exception
end;
end;
end;
double possible de [Libère un TThread automatiquement ou manuellement] (http://stackoverflow.com/questions/3557105/free-a-tthread-either-automatically-or-manually) –
Ne pas suspendre le fil. La méthode terminate définit simplement la propriété Terminated sur true et votre méthode Execute est responsable de terminer le thread. S'il est suspendu, il n'aura pas la chance de se terminer. – jachguate
Un autre problème avec le code ci-dessus, est qu'il libère probablement le thread avant qu'il ait un changement pour terminer la manière normale. –