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

Langage Delphi Discussion :

thread terminate destroy onclose onclosequery


Sujet :

Langage Delphi

  1. #1
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 419
    Points
    1 419
    Par défaut thread terminate destroy onclose onclosequery
    bonjour, j'ai un thread en état suspendu crée au démarrage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThreadExemple := TMyThread.Create(True);
    lors de la fermeture de l'application dans le onclosequery
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThreadExemple.Terminate;
    delphi 2007 me rapporte que mon thread n'est pas libéré, j'utilise dans le projet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      {$IFDEF DEBUG}
      ReportMemoryLeaksOnShutDown := true; //si debug on affiche les problèmes de libération de mémoire
      {$ENDIF}
    si je teste dans memproof, il est bien libéré il s'affiche pas.

    si je met un bouton avec le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThreadExemple.Terminate;
    delphi et memproof n'affiche rien

    je comprend pas c'est une erreur ou c'est ReportMemoryLeaksOnShutDown qui se trompe ce que je pense pas? je met un point d'arrêt dans le destructeur du thread et avec le bouton je stop dessus tandis qu'avec onclosequery sa s'arrête pas comme si il était sauté

    j'ai essayé le onclose, de mettre freeonterminate à false et d'appeller ThreadExemple.Free, de resumer mon thread, mais sa change pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Destructor TMyThread.Destroy;
    Begin
      List.Free;
      GLock.Free;
      inherited Destroy;
    End;
    merci pour votre aide
    Il existe 3 sortes de gens: ceux qui savent compter et ceux qui ne savent pas.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 508
    Points : 25 011
    Points
    25 011
    Par défaut
    Question : Pourquoi créer un thread suspendu pendant tout le long du programme, autant le créer une fois qu'il est vraiement utile ...

    et tu as vraiement besoin d'un thread à ce moment ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 738
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 738
    Points : 13 278
    Points
    13 278
    Par défaut
    A moins qu'il y ait un FreeOnTerminate défini, le Thread n'est pas détruit après l'appel à Terminate. Et de toute façon, dans l'état suspendu cet appel ne sert à rien .

    Maintenant ce qui peux se passer, sous Seven (sous Vista, je ne me souviens plus...) toutes les allocations faites sont automatiquement libérées à la fin du processus, même si tu as oublié (!) de le faire toi-même: il ne devrait plus y avoir de memory leak à la fermeture d'une application .

    Vu ce qui précède, ReportMemoryLeaksOnShutDown te génère un rapport depuis l'intérieur du processus en cours: la mémoire n'est pas libérée -> avertissement. Alors que MemProof est un processus externe et si Windows a bien fait son boulot, il ne verra rien puisque tout aura été remis en ordre !

    Enfin, ce n'est qu'une supposition .

  4. #4
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 419
    Points
    1 419
    Par défaut
    @ShaiLeTroll: le thread gère une liste d'objet qu'il modifie mais j'ai essayé en y desactivant même erreur pour sa que j'en parle pas. il se suspent après traitement et se resume lors d'ajout d'objet à traiter.

    donc au moment de quitter il peut etre suspendu, ou pas... mais la je test et bloque sur l'état suspendu.

    @Andnotor:
    A moins qu'il y ait un FreeOnTerminate défini, le Thread n'est pas détruit après l'appel à Terminate. Et de toute façon, dans l'état suspendu cet appel ne sert à rien .
    FreeOnTerminate à true, j'essaye de le resumer avant de le terminer mais vu qu'il n'y a rien à traiter il se suspend aussitot, donc j'ai crée ma procedure qui l'empeche de se suspendre je le resume et terminate
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Procedure TMyThread.ResumeAndTerminate;
    Begin
       FStopIt:=true;
       Resume;
       Terminate;
    End;
    et la miracle! sa a changer ... le nombre ligne mais toujours pas de libération lors du onclosequery. je suis sur xp sp3 au fait même si sa change rien la.

    j'adhère à ta supposition aussi.
    Il existe 3 sortes de gens: ceux qui savent compter et ceux qui ne savent pas.

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 738
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 738
    Points : 13 278
    Points
    13 278
    Par défaut
    C'est l'inverse que tu devrais faire: Terminate puis Resume .
    Mais pourquoi ne pas simplement appeler ThreadExemple.Free ?

  6. #6
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 419
    Points
    1 419
    Par défaut
    terminate puis resume, sa change rien. Pénible.

    Free
    fige le programme, il quitte pas, le thread se finit pas, je met freeonterminate à false et appelle juste free c'est sa? l'etat suspended pose problème peut-être

    edit sa fige ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Destructor TMyThread.Destroy;
    Begin
      List.Free;
      GLock.Free;
      inherited Destroy;
    End;
    edit2 pas a pas détaillé sa boucle en infini ici, c'est dans TThread.WaitFor
    qui est appelé par TThread.Destroy:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        repeat
          { This prevents a potential deadlock if the background thread
            does a SendMessage to the foreground thread }
          if WaitResult = WAIT_OBJECT_0 + 2 then
            PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE);
          WaitResult := MsgWaitForMultipleObjects(2, H, False, 1000, QS_SENDMESSAGE);
          CheckThreadError(WaitResult <> WAIT_FAILED);
          if WaitResult = WAIT_OBJECT_0 + 1 then
            CheckSynchronize;
        until WaitResult = WAIT_OBJECT_0;
    edit3: bon la c'est sur appeler resume dans onclosequery, onclose, ondestroy ne resume pas le truc d'ou la boucle infini.
    Il existe 3 sortes de gens: ceux qui savent compter et ceux qui ne savent pas.

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 738
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 738
    Points : 13 278
    Points
    13 278
    Par défaut
    C'est ta procédure Execute qui n'est pas correct alors !
    Est-ce que tu testes Terminated en début de procédure ?

  8. #8
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 419
    Points
    1 419
    Par défaut
    alors j'ai trouvé mais bizarre, dans mon onclosequery juste avant terminate une procédure appelait suspend, je l'ai viré et que mon thread fonctionne ou est suspendu il se termine et se libère.

    alors pourquoi appeler suspend juste avant bloque mystère surtout si il est déjà suspendu
    Il existe 3 sortes de gens: ceux qui savent compter et ceux qui ne savent pas.

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

Discussions similaires

  1. Chat - Thread Terminate et déconnection
    Par Bigmlb dans le forum Langage
    Réponses: 2
    Dernier message: 09/06/2014, 04h21
  2. Réponses: 1
    Dernier message: 09/07/2008, 12h17
  3. [MFC] Thread terminé brutalement
    Par OjBarbare dans le forum MFC
    Réponses: 25
    Dernier message: 20/02/2006, 11h15
  4. Application->Terminate et OnClose, OnCloseQuery
    Par Neilos dans le forum C++Builder
    Réponses: 7
    Dernier message: 10/09/2005, 13h58

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