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 qui s'arrête prématurément !


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Ukraine

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 162
    Points : 163
    Points
    163
    Par défaut Thread qui s'arrête prématurément !
    Bonjour,
    J'utilise trois threads qui font (certains seulement) appels à des variables globales (unité parente), mais un seul s'arrête prématurément (vérifié grâce à la propriété "finished"), alors que j'utilise des TCriticalSection pour tous les trois (et les appele avec Synchronize ), et celà après un certain flux intensif !!

    Une idée ?? !!

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 831
    Points : 13 579
    Points
    13 579
    Par défaut
    Tu as une exception qui survient dans ton thread. C'est la seule chose qui pourrait te faire sortir de la boucle Execute. (Si il y a un While not Terminated)

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Ukraine

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 162
    Points : 163
    Points
    163
    Par défaut
    Je pense que oui;
    Mais alors comment ça se fait que je ne reçois pas de message d'erreur !
    Et comment je pourrais débugger ça convenablement et efficament ?!!
    Merci.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 831
    Points : 13 579
    Points
    13 579
    Par défaut
    Parce que l'exception est propre au thread secondaire et que le thread principal n'en a pas connaissance. TApplication (tournant dans le thread principal) ne peut donc rien afficher .

    Il y a deux parades possibles:

    Utiliser directement l'API MessageBox dans le thread:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TMyThread.Execute;
    begin
      try
        Raise Exception.Create('Oups... Erreur');
      except
        on E:Exception do
          MessageBox(0, PChar(E.Message), nil, MB_OK or MB_ICONERROR);
      end;
    end;
    ou faire afficher l'exception par un appel synchronisé au thread principal:

    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
    type
      TMyThread = class(TThread)
      private
        FException :Exception;
      protected
        procedure ShowException;
        procedure Execute; override;
      end;
     
    implementation
     
    procedure TMyThread.Execute;
    begin
      try
        Raise Exception.Create('Oups... Erreur');
      except
        FException := Exception(ExceptObject);
        Synchronize(ShowException);
      end;
    end;
     
    procedure TMyThread.ShowException;
    begin
      Application.ShowException(FException);
    end;
    On pourrait aussi définir une fois pour toute une fonction générique qui prenne également en compte EAbort:

    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
      TMyThread = class(TThread)
      protected
        procedure ShowException; virtual;
        procedure Execute; override;
      end;
     
    implementation
     
    procedure TMyThread.Execute;
    begin
      try
        Raise Exception.Create('Oups... Erreur');
      except
        ShowException;
      end;
    end;
     
    procedure TMyThread.ShowException;
    var
      E :Exception;
    begin
      E := Exception(ExceptObject);
     
      if not (E is EAbort) then
        MessageBox(0, PChar(E.Message), nil, MB_OK or MB_ICONERROR);
    end;

  5. #5
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut


    une autre astuce consiste à tester la propriété FatalException dans un gestionnaire pour l'évènement OnTerminate du Thread.
    Citation Envoyé par Aide delphi
    Si la méthode Execute provoque une exception qui n'est pas capturée ni gérée à l'intérieur de cette méthode, le thread se termine et définit FatalException par l'objet exception de cette exception. Les applications peuvent tester FatalException depuis un gestionnaire d'événement OnTerminate pour déterminer si l'achèvement du thread est due à une exception.

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Ukraine

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 162
    Points : 163
    Points
    163
    Par défaut
    Bonjour,
    En effet, c'était une exception qui se produisait.
    Et maintenant que j'ai localisé l'erreur, le problème est réglé.

    Merci beaucoup pour votre aide.

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

Discussions similaires

  1. Thread dans un service qui s'arrête
    Par gRRosminet dans le forum Android
    Réponses: 7
    Dernier message: 14/09/2012, 10h44
  2. comment créer un thread qui s'exécute automatiquement sans arrêt
    Par oumay dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 21/09/2010, 12h29
  3. compilation qui s'arrête
    Par Grecko dans le forum Dev-C++
    Réponses: 5
    Dernier message: 08/01/2007, 16h17
  4. [THREAD] reveiller un thread qui dort
    Par silouane dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 24/01/2006, 14h39
  5. [Thread] comment arreter un thread qui execute une methode b
    Par Cyber@l dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 04/08/2004, 11h51

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