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

Delphi Discussion :

[delphi] Thread relancement


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 22
    Par défaut [delphi] Thread relancement
    Bonjour,

    J'ai une question en rapport avec les thread (et oui encore :p). Ce que je voudrais faire c'est pouvoir relancer un thread apres qu'il soit terminer.
    Voici le code de mon constructeur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    constructor TThreadFlan.create(posteFlan: TPosteFlan);
    begin
      if assigned(posteFlan) then
      begin
        FPosteFlan:= posteFlan;
        FreeOnTerminate:= True;   // se detruit quand il a finit son execution
        inherited create(true);   // NE s'execute PAS dès qu'il est crée
        OnTerminate:= onTerminatedProcedure;
        threadTerminated:= false;
        SetLength(blocInterro, 3);
      end;
    end;
    Jusqu'ici tout va bien mais lorsque je teste si mon thread (apres avoir été terminer) est assigner, je remarque qu'il l'est toujours.
    En effet lorsque j'execute ce code:

    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
     
    procedure TPosteFlan.setEnabled(value: boolean);
    begin
      FEnabled:= value;
     
      if FEnabled then
      begin
        // si le thread s'est terminé alors on recrée l'instance pour pouvoir le relancer
        if thread.threadTerminated then
          thread:= TThreadFlan.create(self);
        thread.Resume;
      end
      else
        if not thread.threadTerminated then
          thread.Terminate;
    end;
    il rentre dans ma boucle if thread.threadTerminated alors qu'en principe mon thread doit etre libéré ( et donc delphi devrais planter :s) je ne comprend pas trop??

    Sinon j'aurais voulu savoir si je ne met FreeOnTerminate:= False; dans mon create et que lorsque je recrée mon thread (thread:= TThreadFlan.create(self); ) pour pouvoir le relancer, il recrée l'instance dans la meme zone mémoire ou dans une zone différente?? Je voudrai savoir cela car mon application doit "tourner en continu" et j'aimerai eviter au maximun les fuites mémoires.

    Merci d'avance pour vos reponses.

    Cedric

  2. #2
    Membre émérite Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Par défaut
    Salut,

    Jai du mal à voir ton problème est fait.
    Lorsque tu fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if thread.threadTerminated then
          thread:= TThreadFlan.create(self);
        thread.Resume;
    A priori ton ancien thread se termine, se libère puis tu en lance un nouveau.

    il recrée l'instance dans la meme zone mémoire ou dans une zone différente?
    Il n'y a aucune raison, windows utilisera une adresse différentes à chaque fois (comme pour une variable dynamique), mais si les libérations sont bien faites tu n'auras pas de problème de fuites.

    Il existe aussi un moyen de voir l'ensemble de tes threads crés à un instant t(sous Linux je sais, sous Windows ça doit être dans "processus" (non-vérifié).

    @+.

  3. #3
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 22
    Par défaut
    Bé en fait lorsque mon thread se termine, il doit se libérer grace a FreeOnTerminate:= True; donc si je verifie l'etat d'un thread qui a été libéré:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if thread.threadTerminated then
          thread:= TThreadFlan.create(self);
        thread.Resume;
    il devrais planter...

    Si mon thread est libéré et que je verifie l'etat d'un thread libéré delphi devrais pas trop aimer c'est pour sa que je comprend pas...

    PS: Pour voir les thread exécuter il suffit d'allez dans le menu voir/fenetre de debogage/ thread

  4. #4
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    il devrais planter...
    Ce n'est pas tout à fait exact : il pourrait planter

    Le thread est libéré, la mémoire utilisée devient disponible, mais elle n'est pas forcément "écrasée" immédiatement. Elle le sera quand le gestionnaire mémoire la récupèrera pour d'autres allocations de variables ou d'objets.

  5. #5
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 22
    Par défaut
    Bonjour Graffito,

    d'accord je pense comprendre, donc je verifie qu'il est toujours assigné puis si il est arreter pour le recréer, il ne dervais pas y avoir de probleme alors .

    Merci pour vos reponses, c'est cool !

    ced

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

Discussions similaires

  1. [Thread] Relancer un thread.
    Par Djobird dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 13/07/2009, 17h28
  2. delphi/Oracle :FListner, arret d'un thread
    Par Lust14 dans le forum Delphi
    Réponses: 10
    Dernier message: 07/12/2006, 20h23
  3. Réponses: 3
    Dernier message: 13/11/2006, 14h28
  4. [Delphi 6] Impossible de relancer
    Par chambrier patrick dans le forum Delphi
    Réponses: 1
    Dernier message: 19/07/2006, 10h27
  5. [Thread]Relancer un thread
    Par Pill_S dans le forum Concurrence et multi-thread
    Réponses: 9
    Dernier message: 28/04/2005, 20h41

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