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] Réinitialiser un thread


Sujet :

Langage Delphi

  1. #1
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut [Thread] Réinitialiser un thread
    Salut tout le monde
    Voila, je voudrais savoir comment faire pour dire à un thread de se remettre à zéro.
    Mon application:
    Lors du lancement de l'application, je crée un thread en Suspended qui contient des composants de BDD dans lesquels il va chercher... Si je les crée dans ce thread, c'est que j'ai pas mal d'initialisation à faire et je voudrais le faire une bonne fois pour toutes...
    Je voudrais pouvoir réinitialiser le thread pour le faire repartir du début de la recherche quand je veux...
    Comment faire?
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  2. #2
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Réinitialiser signifierait donc repartir du début de la méthode execute.
    Je te dirais bien de détruire le thread et d'en relancer un autre, mais j'imagine que tu ne veux pas. Sinon, je ne vois pas comment tu pourrais faire.
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  3. #3
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Ben c'est ce que j'ai fait: lancer Execute Depuis des méthodes de mon cru... Mais j'ai l'impression (qui est réelle ) que mon thread bloque mon appli...
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  4. #4
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    Citation Envoyé par Pedro204
    Ben c'est ce que j'ai fait: lancer Execute Depuis des méthodes de mon cru... Mais j'ai l'impression (qui est réelle ) que mon thread bloque mon appli...
    Pas étonnant la méthode Execute n'est pas un thread en soi. C'est le contenu du thread car c'est cette méthode qui est passée en paramètre à CreateThread.
    Ce que tu peux par contre faire, c'est mettre au point une méthode qui utilise une section critique pour mettre une variable booléenne de ta classe TThread à True.
    Ensuite, dans ta méthode Execute tu vérifie de temps en temps cette variable et si elle est à True, tu la remets à False (en utilisant la même méthode, pour utiliser la section critique) et tu retournes au début de ta méthode (avec une boucle ou un goto).
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  5. #5
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Citation Envoyé par sjrd
    Pas étonnant la méthode Execute n'est pas un thread en soi.
    C'est exactement ce que je me disais...
    Citation Envoyé par sjrd
    Ensuite, dans ta méthode Execute tu vérifie de temps en temps cette variable et si elle est à True, tu la remets à False (en utilisant la même méthode, pour utiliser la section critique) et tu retournes au début de ta méthode (avec une boucle ou un goto).
    Section critique Je ne sais pas faire...
    Je pense que je vais tout recréer à chaque fois mais ça risque d'être long et ça ne me plait pas vraiment...
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  6. #6
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    Citation Envoyé par Pedro204
    Section critique Je ne sais pas faire...
    Je pense que je vais tout recréer à chaque fois mais ça risque d'être long et ça ne me plait pas vraiment...
    Va voir l'aide sur TCriticalSection
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  7. #7
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Mais avant toute chose, as-tu vraiment besoin de "réinitialiser" ton thread ?
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  8. #8
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Citation Envoyé par sjrd
    Va voir l'aide sur TCriticalSection
    Je te remercie
    Citation Envoyé par MD Software
    Mais avant toute chose, as-tu vraiment besoin de "réinitialiser" ton thread ?
    ? Que veux-tu dire ?
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  9. #9
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Je veux éviter de détruire puis reconstruire mon thread parce que l'initalisation est assez longue (BDD)...
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  10. #10
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    Bon voilà un bon bout de 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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    unit uThread;
     
    interface
     
    type
      TMonThread = class(TThread)
      private
        FReinitialize : boolean;
        FCriticSection : TCriticalSection;
      protected
        procedure Execute; override;
      public
        constructor Create(CreateSuspended : boolean);
        destructor Destroy; override;
        procedure Reinitialize(Value : boolean = True);
      end;
     
    implementation
     
    constructor TMonThread.Create(CreateSuspended : boolean);
    begin
      inherited;
      FReinitialize := False;
      FCriticSection := TCriticalSection.Create;
    end;
     
    destructor TMonThread.Destroy;
    begin
      FCriticSection.Free;
    end;
     
    procedure TMonThread.Execute;
    label Debut;
    begin
    Debut :
      ...
      if FReinitialize then
      begin
        Reinitialize(False);
        goto Debut;
      end;
      ...
    end;
     
    procedure TMonThread.Reinitialize(Value : boolean = True);
    begin
      FCriticSection.Acquire;
      try
        FReintialize := Value;
      finally
        FCriticSection.Leave;
      end;
    end;
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  11. #11
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Un grand sjrd
    Arrgh que vois-je!! Un goto? Non... Je ne peux plus...respirer.. Je... J'étouffe... Je fonds... Arrrhhh...
    Jamais de la vie je n'utiliserais de Goto... Même sous la menace d'une arme...
    Je vais essayer comme ça ce soir (sans le Goto )
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  12. #12
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    Eh oui, un goto Je sais qu'il n'y a pas beaucoup de monde qui aime cette instruction, mais dans ce cas c'est le plus simple et le plus rapide (comparé à une boucle où tu seras obligé de faire une double-boucle avec des Continue et des Break à plein d'endroits

    Donc vive les goto !... quand ils ont leur place bien sûr.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  13. #13
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Au lieu de faire une boucle, on peut le mettre aussi en Suspended non? C'est plus propre...
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  14. #14
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    "goto", c'est pas bon moi aussi je hai cette instruction de m...
    si tu as besoin de trhéade que pour initialisé
    dans le code de sjrd:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    .....
    procedure TMonThread.Execute; 
    begin 
    repeat  
    ... 
      if FReinitialize then 
      begin 
        //   code d'initialisation
        Reinitialize(False); 
      end;
    until terminated; 
      ... 
    end;
    bien sûr dans votre code principale aprés création de thréade tu met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonThread.Reinitialize(true);
    bon dev et mort au goto
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  15. #15
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Merci c'est le genre de truc que je comptais faire

    Citation Envoyé par edam
    bon dev et mort au goto
    Tout pareil!
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  16. #16
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    "goto", c'est pas bon moi aussi je hai cette instruction de m...
    Mais non... Il suffit de les utiliser là ou il faut. Des analyseurs syntaxiques sont par exemple bourrés de goto, et personne ne trouve rien à redire, car c'est la meilleure solution de faire, tout simplement.
    "It's more fun to compute !"

  17. #17
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    Citation Envoyé par Pedro204
    Citation Envoyé par edam
    bon dev et mort au goto
    Tout pareil!
    Bande d'assassins !

    Je confirme ma position : les goto peuvent être très utiles lorsqu'ils sont bien utilisés, souvent dans ce genre de cas où il faut retourner au début d'une procédure.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  18. #18
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Je dis ça uniquement parce qu'à la fac on m'a strictement interdit de l'utiliser... Je suis d'accord que parfois, c'est vraiment utile mais ce n'est vraiment pas propre et rigoureux.
    Enfin, c'est mon avis et ce n'est pas le sujet initial du post.
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  19. #19
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    Citation Envoyé par Dans sa signature, Pedro204
    Rage against the Goto
    T'exagères

    Bon, trève de plaisanteries, tu passes en
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  20. #20
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Ca y est, ça marche!
    En utilisant la méthode sjrd et en l'adaptant sans trop de difficultés ça marche super
    Maintenant je peux mettre résolu
    Merci à tous
    Citation Envoyé par sjrd
    T'exagères
    T'as raison
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/05/2005, 15h52
  2. [Thread]Relancer un thread
    Par Pill_S dans le forum Concurrence et multi-thread
    Réponses: 9
    Dernier message: 28/04/2005, 20h41
  3. [Thread] Interrompre un Thread
    Par Arnaud51 dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 13/03/2005, 21h41
  4. [Thread] Retrouver un thread dont on a plus la référence
    Par ptitjack dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 01/10/2004, 10h56
  5. Réponses: 3
    Dernier message: 11/02/2004, 12h50

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