J'ai un thread principal et un thread séparé dans mon programme. Si le thread séparé finit avant le thread principal, il devrait se libérer automatiquement. Si le fil principal finit en premier, il doit libérer le fil séparé.Libérer un TThread automatiquement ou manuellement
Je connais FreeOnTerminate, et j'ai lu que vous devez faire attention à l'utiliser.
Ma question est, le code suivant est-il correct?
procedure TMyThread.Execute;
begin
... Do some processing
Synchronize(ThreadFinished);
if Terminated then exit;
FreeOnTerminate := true;
end;
procedure TMyThread.ThreadFinished;
begin
MainForm.MyThreadReady := true;
end;
procedure TMainForm.Create;
begin
MyThreadReady := false;
MyThread := TMyThread.Create(false);
end;
procedure TMainForm.Close;
begin
if not MyThreadReady then
begin
MyThread.Terminate;
MyThread.WaitFor;
MyThread.Free;
end;
end;
Bonjour! FreeOnTerminate seul n'est pas une option. D'un autre côté, je ne veux pas que le thread enregistre de la mémoire pendant l'exécution du programme Main. Je synchronise le booléen parce que je crois qu'il garantit qu'il s'exécutera avant MainForm.Close ou après MainForm.Close. Donc, MyThread.Terminate ne sera appelé que si FreeOnTerminate est faux. Est-ce que je me trompe ici? – Steve
Quelle est la quantité de mémoire que le thread 'hog' une fois terminé? Si vous ne pouvez pas dire que vous n'avez aucune raison de vous inquiéter. Mesurez d'abord. Mais si vous insistez, publiez un message de votre thread comme dernière chose et libérez le thread dans le gestionnaire de messages. 'Synchronize()' est trop vil pour penser même si votre code fonctionnerait dans toutes les circonstances. Dites simplement non. – mghie
Accepter cela comme la solution car c'est la plus propre. Merci à tous pour les réponses! – Steve