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 :

Que faire une fois le thread exécuté ?


Sujet :

Langage Delphi

  1. #1
    Débutant
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 886
    Points : 330
    Points
    330
    Par défaut Que faire une fois le thread exécuté ?
    bonjour

    je dois effectuer une vérification en interrogeant un serveur toute les x secondes et afin de ne pas geler mon application, on m'a conseillé de passer par un thread qui sera lancé dans un timer

    j'ai réussis, et ça fonctionne bien

    seulement, j'aimerais savoir si par convention je dois faire quelque chose une fois les actions du thread réalisées; comme par exemple détruire le thread ou autre

    et que se passe t il si je ne le fais pas ?

    voilà mon 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
      TMon_operation = class(TThread)
      private
        j: Integer;
        { Private declarations }
      protected
        procedure GetResult;
        procedure Execute; override;
      end;
     
     
    procedure TMon_operation.GetResult;
    begin
     
      // le code de mon opération
     
      edit1.text := 'testtt';
     
     // ect ...
     
    end;
     
     
    procedure TMon_operation.Execute;
    begin
      Synchronize(GetResult);
    end;
     
     
    // et dans mon timer
     
    procedure TForm1.Timer1(Sender: TObject);
    var
      NewThread: TMon_operation;
    begin
      NewThread := TMon_operation.Create(False);
    end;

    je suis obligé de passer par là car mon code interagit avec la VCL

    mais je me sens un peu mal ... d'exécuter à chaque fois le thread sans avoir à le fermer / détruire ...

    dois je rajouter quelque chose ? ou le thread fait lui même le travail de fermeture une fois exécuté ?

    merci d'avance

  2. #2
    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
    si tu ne veux pas détruire explicitement ton thread du dois définir FreeOnTerminate := true; lors de sa création, dans le style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    constructor  TMon_operation.create(ACreateSuspended: boolean);
    { Constructeur }
    begin
     
      FreeOnTerminate := true;
     
     
      inherited create(ACreateSuspended);
    end;

  3. #3
    Débutant
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 886
    Points : 330
    Points
    330
    Par défaut
    salut,

    merci pour ton aide

    mais ce n'est pas moi qui code le constructeur, j'ai mis le code que j'utilise

    dans ce cas, comment détruire explicitement ?

    sinon, j'utilise ce code depuis un moment déjà, je n'ai jamais eu vraiment de soucis, mais c'est maintenant que je m’aperçois que je créé le thread en boucle

    en même temps, est ce que le faite de créer à chaque fois ne détruit pas le précédent ?

  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
    et ça c'est pas ton code ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     TMon_operation = class(TThread)
      private
        j: Integer;
        { Private declarations }
      protected
        procedure GetResult;
        procedure Execute; override;
      end;
    il suffit de tu ajoutes un nouveau constructeur

    sinon avec ta façon de faire tu as une fuite de mémoire

  5. #5
    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
    autrement plutôt que de créer un thread dans un timer, tu peux créer un seul thread qui durera pendant tout ton programme et qui tout les x secondes feras ta tache

    va lire http://reisubar.developpez.com/threadevents/ et inspires toi de la partie 5

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 754
    Points : 13 340
    Points
    13 340
    Par défaut
    Si Execute de la tâche ne fait que lancer un Synchronize, ce thread ne sert à rien. Il ne fait qu'ajouter un temps d'attente supplémentaire au démarrage mais est tout autant bloquant par la suite.

  7. #7
    Débutant
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 886
    Points : 330
    Points
    330
    Par défaut
    exoseven, oui c'est ma déclaration du thread

    je m'étais inspiré du tuto que tu m'as envoyé, mais j'ai eu un soucis car je devais utiliser la VCL

    andnotor je ne sais plus qui m'avais donné cette astuce, mettre mon code dans le getresult et appeler via syncronize

    mais voilà après tout ce temps j'essais de faire les choses bien

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 754
    Points : 13 340
    Points
    13 340
    Par défaut
    Citation Envoyé par Coussati Voir le message
    je ne sais plus qui m'avais donné cette astuce, mettre mon code dans le getresult et appeler via syncronize
    Oui mais uniquement la partie concernant le mise à jour de l'affichage. L'interrogation du serveur doit être dans Execute hors Synchronize (tu peux créer dynamiquement un TIdHttp).
    Le timer n'a aucune utilité ici. Comme l'a dit exoseven, tu peux laisser tourner le thread en boucle sans soucis.

  9. #9
    Débutant
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 886
    Points : 330
    Points
    330
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Oui mais uniquement la partie concernant le mise à jour de l'affichage. L'interrogation du serveur doit être dans Execute hors Synchronize (tu peux créer dynamiquement un TIdHttp).
    Le timer n'a aucune utilité ici. Comme l'a dit exoseven, tu peux laisser tourner le thread en boucle sans soucis.
    oui c'est pas un soucis pour le compo TIdHttp mais l'affichage du résultat dans un Tmemo ou tlabel comment je peux le gérer ?

    [hors-sujet]il me semble que c'était toi qui m'avait donnée l'astuce de rajouter un nombre variable à la fin de l'url afin de ne pas avoir de prob de cache lors de requêtes répétées ... j'ai posté un problème similaire dans la rubrique réseau, pourrais tu me donner ton avis stp ?[/]

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 754
    Points : 13 340
    Points
    13 340
    Par défaut
    Citation Envoyé par Coussati Voir le message
    oui c'est pas un soucis pour le compo TIdHttp mais l'affichage du résultat dans un Tmemo ou tlabel comment je peux le gérer ?
    Comme déjà dit, pour l'affichage Synchronize est ok mais pas pour des opérations longues. Pense que ton serveur ne réponde pas, ton application est bloquée jusqu'au time-out
    Il y a sinon d'autres façons de faire en asynchrone en allouant par exemple de la mémoire par GetMem (rempli ensuite avec ta chaîne) et en passant le pointeur par PostMessage à la fiche. Elle se charge ensuite de remplir le mémo et de libérer la mémoire (FreeMem) lorsqu'elle en a le temps.

  11. #11
    Débutant
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 886
    Points : 330
    Points
    330
    Par défaut
    je verrai sans ce sens

    merci à vous 2 en tout cas

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

Discussions similaires

  1. Il était une fois 3 threads: A, B et C . . .
    Par raphael_kindt dans le forum C++
    Réponses: 17
    Dernier message: 07/04/2008, 21h57
  2. Petite question sur la façon de faire une sorte de thread
    Par bit_o dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 09/05/2007, 23h28
  3. Réponses: 4
    Dernier message: 01/12/2006, 14h41
  4. [Re-Orientation] Que faire une fois en L1 informatique
    Par Denti-fritz dans le forum Etudes
    Réponses: 11
    Dernier message: 29/04/2005, 14h38

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