Liberation d'un thread

Résolu
OcHre Messages postés 44 Date d'inscription mercredi 23 mars 2005 Statut Membre Dernière intervention 26 avril 2008 - 1 sept. 2007 à 12:15
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 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?

Rions un peu en attendant la mort.

9 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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.

ciao...
BruNews, MVP VC++
3
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
1 sept. 2007 à 14:03
Salut,

   MonThread.FreeOnTerminate := true;

ne te dispense pas de :

procedure TMainForm.FormDestroy(Sender: TObject);
begin
    if MonThread<>nil then MonThread.Free;
end;
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
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...
  
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
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/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
OcHre Messages postés 44 Date d'inscription mercredi 23 mars 2005 Statut Membre Dernière intervention 26 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é.

Merci pour ta réponse.

Rions un peu en attendant la mort.
0
OcHre Messages postés 44 Date d'inscription mercredi 23 mars 2005 Statut Membre Dernière intervention 26 avril 2008
1 sept. 2007 à 15:43
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.
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
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?
0
OcHre Messages postés 44 Date d'inscription mercredi 23 mars 2005 Statut Membre Dernière intervention 26 avril 2008
2 sept. 2007 à 10:45
Merci pour ces explications qui répondent parfaitement à ma question initiale.

Rions un peu en attendant la mort.
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
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.
0
Rejoignez-nous