OcHre
Messages postés44Date d'inscriptionmercredi 23 mars 2005StatutMembreDernière intervention26 avril 2008
-
1 sept. 2007 à 12:15
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 2019
-
2 sept. 2007 à 14:51
Juste une question concernant la libération d'un thread créé depuis ma
fiche principale. Si je met la propriété FreeOnTerminate à True (donc
je n'appelle pas Thread.Free depuis ma fiche principale) et que
l'utilisateur du programme le ferme pendant que le thread s'éxecute,
celui-ci va se ballader en mémoire jusqu'au prochain reboot ou il va se
libérer?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 2 sept. 2007 à 09:51
Salut les Delphistes,
je n'entends rien à votre langage mais comme je suis tombé sur ce post par hasard...
Un processus (l'enveloppe) est créé quand le lancement d'un thread primaire réussit et que le bloc mémoire est suffisant.
Windows garantit la destruction de tout thread secondaire s'exécutant dans l'espace processus quand le thread primaire retourne, par exemple et le plus courant suite à un retour 0 de GetMessage menant au ExitProcess.
Ceci pour dire qu'un thread balladeur orphelin n'a aucune chance d'exister.
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 1 sept. 2007 à 14:16
...Par contre, je me demande, dans le cas où on ne libère pas le Thread dans le Destroy de la fiche et si on ferme l'Application, si le Thread se libérera quand même quand il aura terminé sa tâche...
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 1 sept. 2007 à 15:37
Il est préférable de détruire un thread secondaire qui errerait seul dans les ténèbres de la machine.
En effet, si le thread secondaire essaie de se synchroniser avec le thread principal alors que ce dernier a pris la fuite, ça mène tout droit à une violation d'accès à coup sûr.
Et s'il n'a pas besoin d'une synchronisation, alors on peut effectivement se demander ce qu'il devient. Voilà une question qu'elle est intéressante
May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
http://www.afipa.net/
Vous n’avez pas trouvé la réponse que vous recherchez ?
OcHre
Messages postés44Date d'inscriptionmercredi 23 mars 2005StatutMembreDernière intervention26 avril 2008 1 sept. 2007 à 15:37
Salut,
j'avais en fait testé avec la meme methode mais dans la propriété
OnClose de ma form sauf que cela m'amenait toujours à un message
d'erreur et je viens d'essayer avec OnDestroy idem... J'imagine donc
que les thread est effectivement bien libéré.
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 1 sept. 2007 à 15:59
@ Delphiprog
Dans le cas d'un Thread secondaire non synchronisé, et en cas de fermeture de l'Application, ce Thread ne deviendrait-il pas tout simplement un processus (process) comme un autre?
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 2 sept. 2007 à 14:51
... Après quelques tests.
Effectivement, il n'y a jamais de Thread orphelin. Et comme l'a fait remarquer très justement BruNews, il semble bien que Windows se charge de la destruction du Thread en cas de fermeture anticipée de l'Application sans précaution (destruction qui ressemble d'ailleurs à un crash).
Cependant,
procedure TForm1.FormDestroy(Sender: TObject);
begin
if Thread<>nil then Thread.Free;
end;
garantie que le Thread terminera sa tâche en douceur en cas fermeture anticipée (synchro ou pas). L'application attendant la fin du Thread pour se fermer.
"freeOnTerminate := true;" ne semblant par contre n'avoir aucun effet dans ce cas.