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 :

Histoire de thread


Sujet :

Langage Delphi

  1. #1
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 441
    Points : 3 076
    Points
    3 076
    Par défaut Histoire de thread
    Bonjour

    Dernier jour avant 2 semaines de congés et j'aimerais comprendre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    var
      Th: TThreadTest;
     
    procedure TForm14.Button1Click(Sender: TObject);
    begin
      Th := TThreadTest.Create(True);
      Th.FreeOnTerminate := True;
      Th.OnTerminate := FinThread;
      Th.Start;
    end;
     
    procedure TForm14.Button2Click(Sender: TObject);
    begin
       Memo1.Lines.Add( BoolToStr(Th = nil, True) );
    end;
     
    procedure TForm14.FinThread(Sender: TObject);
    begin
      Memo1.Lines.Add( TThreadTest(Sender).ThreadID.ToString + ' fini' );
    end;
    Pourquoi le clic sur le bouton 2 affiche False ??

    Autrement dit, le thread une fois terminé ne devrait-il pas être nil ?
    J-L aka Papy pour les amis

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 408
    Points : 307
    Points
    307
    Par défaut
    Bonjour,

    Cela ma parait juste, le thread se termine mais il n'est pas encore terminé, il se détruira, il me semble, après la fin de Th.OnTerminate.
    Donc il n'est pas encore détruit donc th est différent de nil donc dans le memo on à False.

    Je modifie ma réponse, effectivement on peut supposer que le thrad se termine très vite donc le temps de cliquer sur le bouton il y a longtemps qu'il doit être terminé donc je ne comprend pas non plus !!

  3. #3
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 441
    Points : 3 076
    Points
    3 076
    Par défaut
    Ben justement, le thread est créé et lancé par le bouton 1.
    Le FinThread affiche seulement qu'il est terminé.
    Ensuite seulement je clique sur le bouton 2 qui affiche l'état de la variable qui là devrait être nil puisque qu'à ce moment là, FinThread a déjà été exécuté.
    J-L aka Papy pour les amis

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 396
    Points : 640
    Points
    640
    Par défaut
    ce n'est pas parce que ton thread est libéré que th vaudra nil... c'est à toi de le mettre à nil dans FinThread

    c'est pourquoi il existe FreeAndNil

  5. #5
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 441
    Points : 3 076
    Points
    3 076
    Par défaut
    déjà essayé
    J'ai mis FreeAndNil(Sender) dans FinThread. Il aime pas du tout.
    Ordi figé ... obligé de faire CTrl F2 au bout dune bonne minute où l'ordi est limité planté.
    FreeAndNil(TH) fait la même chose


    J'ai aussi tenté FreeAndNil(TH) dans le clic bouton 2.

    ---------------------------
    Notification des exceptions du débogueur
    ---------------------------
    Le projet Project3.exe a déclenché la classe d'exception $C0000008 avec le message 'system exception (code 0xc0000008) at 0x76d925fa'.
    ---------------------------
    Arrêter Continuer Aide
    ---------------------------
    J-L aka Papy pour les amis

  6. #6
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 441
    Points : 3 076
    Points
    3 076
    Par défaut
    pour info le thread ne fait que:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    procedure TThreadTest.Execute;
    begin
      TThread.Sleep(2000);
      Terminate;
    end;
    J-L aka Papy pour les amis

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 744
    Points : 13 303
    Points
    13 303
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    J'ai mis FreeAndNil(Sender) dans FinThread. Il aime pas du tout.
    Sender est l'objet dans lequel tu te trouves. On ne libère jamais un objet dans l'un de ses propres événements sous peine de se retrouver avec des problèmes de pile au retour de la fonction (et donc des VA). Ce qu'il faut faire est simplement Th := nil.

    Th est juste un pointeur pointant sur l'objet TThread. FreeOnTerminate va bien le libérer mais comme tout objet, il n'a pas conscience qu'une (des) variable pointe sur lui.

    Mais assigner un variable lorsque FreeOnTerminate est utilisé n'est pas conseillé (à moins d'ajouter des synchros) puisque tu ne gères pas toi-même sa durée de vie.

    Citation Envoyé par Papy214 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TThreadTest.Execute;
    begin
      TThread.Sleep(2000);
      Terminate;
    end;
    Terminate n'a aucun intérêt ici. Terminate notifie ce thread (par l'intermédiaire du flag Terminated) qu'un autre thread lui a demandé de s'arrêter.
    Le flag Terminated permet ensuite de sortir d'une boucle (s'il y en a une) ou de passer certains traitements.

  8. #8
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 441
    Points : 3 076
    Points
    3 076
    Par défaut
    Bien vu :

    Th := nil; fait le boulot.

    Mais du coup, le FreeOnTerminate, je ne vois pas trop à quoi il sert
    J-L aka Papy pour les amis

  9. #9
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 441
    Points : 3 076
    Points
    3 076
    Par défaut
    Sender est l'objet dans lequel tu te trouves. On ne libère jamais un objet dans l'un de ses propres événements
    Eh oui, je sais bien :-(
    J-L aka Papy pour les amis

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 396
    Points : 640
    Points
    640
    Par défaut
    FreeOnTerminate indique que c'est le thread qui va libérer sa mémoire tout seul.

    attention lorsque tu fais th := nil tu ne libères rien du tout !

    ici il ne sert que parce que tu veux tester que tu as bien terminé ton thread avec un th = nil mais sinon c'est inutile

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 744
    Points : 13 303
    Points
    13 303
    Par défaut
    Citation Envoyé par exoseven Voir le message
    FreeOnTerminate indique que c'est le thread qui va libérer sa mémoire tout seul.
    C'est le thread Windows sous-jacent qui va détruire l'objet Delphi lorsqu'il a terminé son job.

    Citation Envoyé par Papy214 Voir le message
    Mais du coup, le FreeOnTerminate, je ne vois pas trop à quoi il sert
    Au contraire, c'est très pratique et je l'utilise dans la plupart des cas.
    Le problème sinon est de savoir quand le libérer puisqu'on ne peut pas le faire depuis l'un de ses événements. Là, on laisse faire le thread Windows qui est le mieux placé pour savoir quand il a terminé

    Par contre, si tu as besoin d'accéder aux propriétés du thread c'est différent et là tu dois contrôler sa destruction.

    ps: les thread anonymes sont toujours en mode FreeOnTerminate.

  12. #12
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 441
    Points : 3 076
    Points
    3 076
    Par défaut
    Le but du thread utilisé (dans le vrai programme) est de récupérer des infos sur le net, ce qui peut prendre un peu de temps.
    Le thread peut influencer l'affichage principal.
    Mais je ne dois pas lancer le thread 2 fois.
    C'est pour ça que j'ai besoin de savoir si le thread a fini son boulot ou pas.
    Alors, je pourrais ajouter une variable de classe pour donner son état mais je pensais que le freeonterminate suffirait à le mettre à nil .
    Le problème es donc résolu en le mettant à nil dans le "FinThread"

    Merci à tous
    J-L aka Papy pour les amis

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

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 11h28
  3. Programmer des threads
    Par haypo dans le forum C
    Réponses: 6
    Dernier message: 02/07/2002, 13h53
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

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