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 :

[D6] Comment tuer un Thread ?


Sujet :

Langage Delphi

  1. #1
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 670
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 670
    Points : 7 040
    Points
    7 040
    Par défaut [D6] Comment tuer un Thread ?
    J'ai une application, et un thread.
    - A un moment donné, dans mon application, j'ai une erreur de copie de fichier. Jusque là, tout est normal.
    - Je veux arrêter le thread, et le relancer.
    - Je l'arrête avec Terminate et j'essais de le détruire (pour le recréer).
    - Et là, mon application ne répond plus et il reste sur l'instruction MonThread.Free; Le processeur monte à 100% d'activité, et ... plus rien.

    Comment faire ?


  2. #2
    Expert éminent 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
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    L'instruction "terminate" signale simplement au thread qu'il doit se terminer (c'est différrent par rapport au fonctionement de l'API Window qui "tue" le thread).
    Pour que terminate ait un effet, la méthode "execute" doit tester la property "terminated" pour sortir terminer du traitement. Le thread se liberera automatiquement ou non suivant la valeur de sa propriété "FreeOnterminate".

  3. #3
    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 154
    Points
    10 154
    Par défaut
    Si toutefois tu veux killer un thread (mais ce n'est pas conseillé), tu peux faire appel à l'API :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TerminateThread(MonThread.Handle);

  4. #4
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 670
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 670
    Points : 7 040
    Points
    7 040
    Par défaut
    Citation Envoyé par Graffito
    Pour que terminate ait un effet, la méthode "execute" doit tester la property "terminated" pour sortir terminer du traitement.
    C'est ce que j'ai fais dans une boucle while.

    Citation Envoyé par sjrd
    Si toutefois tu veux killer un thread (mais ce n'est pas conseillé), tu peux faire appel à l'API :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TerminateThread(MonThread.Handle);
    Pourquoi ce n'est pas conseillé ?
    Je vais essayé quand même cette solution, car je n'en ai pas d'autre.

  5. #5
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 670
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 670
    Points : 7 040
    Points
    7 040
    Par défaut
    Et bien non.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TerminateThread(ThreadSurveillance.Handle, 0);
    Ca n'a pas plus d'effet.


  6. #6
    Expert éminent 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
    Points : 7 903
    Points
    7 903
    Par défaut
    Citation:
    Graffito a écrit :
    Pour que terminate ait un effet, la méthode "execute" doit tester la property "terminated" pour sortir terminer du traitement.
    C'est ce que j'ai fais dans une boucle while.
    Si la structure du Execute du thread est comme ceci, cela devrait marcher (si la condition du while est un passage obligé) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure myThread.Execute ....
    ...
    while not terminated do begin
           ....
           end ;
    end ;

  7. #7
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 670
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 670
    Points : 7 040
    Points
    7 040
    Par défaut
    Citation Envoyé par Graffito
    Si la structure du Execute du thread est comme ceci, cela devrait marcher (si la condition du while est un passage obligé) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure myThread.Execute ....
    ...
    while not terminated do begin
           ....
           end ;
    end ;
    C'est bien comme ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TerminateThread(ThreadSurveillance.Handle, 0);
    Finalement, ce code semble efficace. Ca s'est mit soudain à fonctionner, sans que je ne change rien.
    Une petite seconde pour détruire le thread, et l'application reprend la main.
    On va dire que c'est résolu.

    pour votre aide.

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

Discussions similaires

  1. [Débutant] Comment tuer un thread?
    Par pixigol dans le forum C#
    Réponses: 2
    Dernier message: 11/01/2013, 14h13
  2. comment tuer un thread
    Par ikuzar dans le forum Débuter
    Réponses: 3
    Dernier message: 18/08/2009, 16h18
  3. Comment tuer une frame
    Par tymous dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 28/07/2004, 11h53
  4. Comment tuer le processus ez-ipupdate
    Par berry dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 21/06/2004, 15h07
  5. comment stoper 1 thread d'arrière-plan
    Par ms91fr dans le forum Langage
    Réponses: 3
    Dernier message: 06/06/2003, 17h46

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