begin process at 2008 05 16 04:27:18
1 173 209 membres
51 nouveaux aujourd'hui
13 970 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Liberation d'un thread [ Système / Mémoire ] (OcHre)

Liberation d'un thread le 01/09/2007 12:15:09

OcHre
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.


Re : Liberation d'un thread le 01/09/2007 14:03:03

Caribensila
Membre Club

Salut,

   MonThread.FreeOnTerminate := true;

ne te dispense pas de :

procedure TMainForm.FormDestroy(Sender: TObject);
begin
    if MonThread<>nil then MonThread.Free;
end;


Re : Liberation d'un thread le 01/09/2007 14:16:12

Caribensila
Membre Club
...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...   

Re : Liberation d'un thread le 01/09/2007 15:37:21

Delphiprog
(Admin CS)
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 !

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.

Re : Liberation d'un thread le 01/09/2007 15:37:48

OcHre
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.


Re : Liberation d'un thread le 01/09/2007 15:43:17

OcHre
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.


Re : Liberation d'un thread le 01/09/2007 15:59:56

Caribensila
Membre Club

@ 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?


Re : Liberation d'un thread le 02/09/2007 09:51:08

BruNews
(Admin CS)
Réponse acceptée !
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++

Re : Liberation d'un thread le 02/09/2007 10:45:56

OcHre
Merci pour ces explications qui répondent parfaitement à ma question initiale.

Rions un peu en attendant la mort.


Re : Liberation d'un thread le 02/09/2007 14:51:06

Caribensila
Membre Club

... 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.



Classé sous : thread, principale, fiche, liberation

Participer à cet échange

Appels d'offres

Pub



CalendriCode

Mai 2008
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Téléchargements

Boutique

Boutique de goodies CodeS-SourceS