Liberation d'un thread [Résolu]

OcHre 46 Messages postés mercredi 23 mars 2005Date d'inscription 26 avril 2008 Dernière intervention - 1 sept. 2007 à 12:15 - Dernière réponse : Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention
- 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
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 2 sept. 2007 à 09:51
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++

Merci BruNews 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 76 internautes ce mois-ci

Commenter la réponse de BruNews
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 1 sept. 2007 à 14:03
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
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 1 sept. 2007 à 14:16
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
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 1 sept. 2007 à 15:37
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
OcHre 46 Messages postés mercredi 23 mars 2005Date d'inscription 26 avril 2008 Dernière intervention - 1 sept. 2007 à 15:37
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
OcHre 46 Messages postés mercredi 23 mars 2005Date d'inscription 26 avril 2008 Dernière intervention - 1 sept. 2007 à 15:43
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
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 1 sept. 2007 à 15:59
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
OcHre 46 Messages postés mercredi 23 mars 2005Date d'inscription 26 avril 2008 Dernière intervention - 2 sept. 2007 à 10:45
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
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 2 sept. 2007 à 14:51
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.