IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Freeze à la libération d'un Thread


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2002
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2002
    Messages : 23
    Par défaut Freeze à la libération d'un Thread
    Bonjour,
    Je travaille sous C++ Builder 2007.
    J'ai le problème suivant : dès que je libère l'allocation mémoire d'un Thread qui est terminé, mon application (TSDIAppForm) freeze.

    Le code est très simple volontairement, il me sert de jeu de test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void __fastcall TSDIAppForm::TBRefreshClick(TObject *Sender)
    {
    tT = NULL;
    tT = new TTest(false);
    tT->OnTerminate = TTestFin;
    }
    La méthode TTestFin est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void __fastcall TSDIAppForm::TTestFin(TObject *Sender)
    {
    	try {
    		Application->MessageBox("Fin du Thread - Avant libération", "Info", MB_OK);
    		if (tT != NULL) {
    			delete tT;
    			tT = NULL;
    		}
    		Application->MessageBox("Après libération", "Info", MB_OK);
    	} catch (Exception &e) {
    		Application->MessageBox("Exception TTestFin", "Exception", MB_OK);
    	}
    }
    J'ai volontairement inséré une boîte de message avant et après.
    Le premier message apparaît bien, pas la seconde.
    Après un débogage pas à pas, je me suis aperçu que c'était la commande delete tT qui provoquait un freeze de l'application.
    A noter, aucune exception n'est levée.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2007
    Messages : 159
    Par défaut
    Bonjour,

    La réponse est assez simple :
    Tu supprimes l'objet appelant le code qui s'exécute.
    Au retour, l'objet appelant n'existe plus (ses tables d'appel de fonction en particulier), et donc le code gèle.
    Ça s'appelle couper la branche sur laquelle on est assis.
    Malheureusement je ne suis pas bien équipé là, je ne peux donc pas te donner d'exemple.
    A mon avis, si tu exécutes en pas à pas, après le delete, tu vas voir des '????' dans les adresses de la pile d'appel.

    Cordialement,
    M.P.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2002
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2002
    Messages : 23
    Par défaut
    Merci pour la réponse, en effet, je me doutais que la libération du Thread dans une fonction qu'il appelle pouvait poser problème.
    En fait, j'ai appliqué le tutoriel de CGI (http://chgi.developpez.com/thread/
    Visiblement (dans le tutoriel), la libération de la ressource allouée au Thread se fait dans la fonction appelée par OnTerminate. Cette méthode serait bien pratique...

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2002
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2002
    Messages : 23
    Par défaut
    Après plusieurs tests, c'est effectivement bien la libération des ressources du Thread dans la méthode OnTerminate qui pose problème.
    Je poste la solution à mon problème (ça pourra toujours aider ceux qui ont le même souci).
    1. Déclarer un pointeur sur le Thread dans le .h de la Form (celle qui appelera le Thread).
    2. Initialiser ce pointeur à NULL dans le constructeur de la Form.
    3. Lorsque vous allez utiliser le Thread, vérifiez si le pointeur est toujours à NULL avant de l'instancier. En effet, vous pouvez utiliser plusieurs fois ce même Thread dans la même Form, il ne faudra pas faire de new à chaque fois, il y aurait une fuite mémoire car vous ne libéreriez que la dernière instance (cf. plus bas). Donc, si le pointeur est toujours à NULL, faites un new.
    4. Indiquez une procédure OnTerminate au Thread (utile pour recueillir les données du traitement du Thread). Pour rappel, à ce niveau, le pointeur sur le Thread est toujours actif, vous pouvez donc faire appel à ses propriétés.
    5. Dans l'événement OnClose de la Form, testez si le pointeur sur le Thread est à NULL, si ce n'est pas le cas, faites un delete.
    Bon développement à tous !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. freezes dans le shell avec thread python
    Par OttisToole dans le forum Général Python
    Réponses: 0
    Dernier message: 10/06/2009, 10h16
  2. [Freezes] Python+Threads sous Windows
    Par gslongo dans le forum GTK+ avec Python
    Réponses: 6
    Dernier message: 24/06/2008, 21h12
  3. Réponses: 11
    Dernier message: 24/11/2006, 22h30
  4. [THREAD][BLOCKINGQUEUE] Comment éviter un 'freeze' ?
    Par narmataru dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 18/09/2006, 12h01
  5. [C#] Plusieurs Thread pour éviter le freeze du chargement
    Par mister3957 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 15/09/2006, 19h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo