Liberation d'un thread [Résolu]

Messages postés
46
Date d'inscription
mercredi 23 mars 2005
Dernière intervention
26 avril 2008
- - Dernière réponse : Caribensila
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
- 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?

Rions un peu en attendant la mort.
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
3
Merci
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.

ciao...
BruNews, MVP VC++

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de BruNews
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
0
Merci
Salut,

   MonThread.FreeOnTerminate := true;

ne te dispense pas de :

procedure TMainForm.FormDestroy(Sender: TObject);
begin
    if MonThread<>nil then MonThread.Free;
end;
Commenter la réponse de Caribensila
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
0
Merci
...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...
  
Commenter la réponse de Caribensila
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
0
Merci
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/
Commenter la réponse de cs_Delphiprog
Messages postés
46
Date d'inscription
mercredi 23 mars 2005
Dernière intervention
26 avril 2008
0
Merci
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é.

Merci pour ta réponse.

Rions un peu en attendant la mort.
Commenter la réponse de OcHre
Messages postés
46
Date d'inscription
mercredi 23 mars 2005
Dernière intervention
26 avril 2008
0
Merci
Oups, je n'avais pas vu le post de Delphiprog.

Le thread devrait donc tester l'existence de la fiche et, si elle n'est plus, se terminer?
Rions un peu en attendant la mort.
Commenter la réponse de OcHre
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
0
Merci
@ 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?
Commenter la réponse de Caribensila
Messages postés
46
Date d'inscription
mercredi 23 mars 2005
Dernière intervention
26 avril 2008
0
Merci
Merci pour ces explications qui répondent parfaitement à ma question initiale.

Rions un peu en attendant la mort.
Commenter la réponse de OcHre
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
0
Merci
... 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.
Commenter la réponse de Caribensila

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.