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 :

[Multi thread] Attendre la fin des threads


Sujet :

Langage Delphi

  1. #1
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut [Multi thread] Attendre la fin des threads
    Salut tout le monde,

    Je suis un peu rouillé et j'aurais besoin d'un coup de main.
    J'ai une application qui lance 4 Threads identiques et qui attend la fin de ces 4 Threads de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WaitForMultipleObjects(Length(HandleArray), @HandleArray[0], True, 5000);
    Tout va bien, sauf si j'ai une exception dans l'un des Threads.
    Quand ce cas ce produit, je suis obligé d'attendre la fin du TimeOut (5000 ms) pour savoir que j'ai eu un problème.
    N'y a -t il pas un autre moyen pour attendre la fin des threads et avoir l'exception plus rapidement ?

    Merci d'avance.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 755
    Points : 13 349
    Points
    13 349
    Par défaut
    Au contraire, une exception non gérée devrait te faire sortir de la procédure Execute et donc immédiatement terminer le thread.

    Le problème ici serait plutôt inverse, quelque chose comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while not Terminated do
    try
    except
    end;

  3. #3
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    Rien de cela dans mon code.

    Je met mon code de test.

    Code du Thread

    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
     
    unit WorkerThread;
     
    interface
     
    uses Classes, SysUtils;
     
    type
      TWorkerThread = class(TThread)
      private
        FProcedure:TThreadMethod;
      public
        procedure Execute; override;
        class function RunInThread(AWorkerProcedure: TThreadMethod):TThread;
      end;
     
     
    implementation
     
    { TWorkerThread }
     
    procedure TWorkerThread.Execute;
    begin
      FProcedure;
    end;
     
    class function TWorkerThread.RunInThread(AWorkerProcedure: TThreadMethod): TThread;
    begin
      result:=TWorkerThread.Create(true);
      with TWorkerThread(result) do
      begin
        FreeOnTerminate := False;
        FProcedure := AWorkerProcedure;
      end;
    end;
    Code de test :

    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
    54
    55
     
    procedure TForm3.DebugException;
    begin
      raise CException.Create('Ceci est une exception');
    end;
     
    function TForm3.TestThread:Cardinal;
    var
      CountActiveSite:Integer;
      Index:Integer;
      Loop:integer;
      HandleArray:array of THandle;
    begin
      CountActiveSite:=3;
      //On augmente la taille du tableau des Handles
      SetLength(HandleArray,CountActiveSite);
      SetLength(ThreadArray,CountActiveSite);
     
      for Loop := 0 to CountActiveSite - 1 do
      begin
        ThreadArray[loop]:=TWorkerThread.RunInThread(DebugException);
        HandleArray[loop]:=ThreadArray[loop].Handle;
     
        with TWorkerThread(ThreadArray[loop]) do
        begin
          OnTerminate:=EndThread;
          Resume;
        end;
      end;
     
      Result:=WaitForMultipleObjects(Length(HandleArray), @HandleArray[0], True, 5000);
    end;
     
    procedure TForm3.Button1Click(Sender: TObject);
    begin
      showmessage(inttostr(TestThread)+#13#10+'WAIT_OBJECT_0: '+inttostr(WAIT_OBJECT_0));
    end;
     
    procedure TForm3.EndThread(Sender: TObject);
    var
      ex: TObject;
    begin
      with TThread(Sender) do
        if Assigned(FatalException) then
        begin
          if FatalException is Exception then
          begin
            MessageDlg(Exception(FatalException).Message, mtError, [mbOk], 0);
          end;
        end
        else
        begin
          MessageDlg('Pas d''erreur',mtInformation,[mbOk],0);
        end;
    end;

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 755
    Points : 13 349
    Points
    13 349
    Par défaut
    Appeler une méthode de la fiche depuis un thread secondaire sans synchronisation ne peut qu'être source de problème. Synchronisation qui est ici bien sûr inapplicable du fait du Wait. Il faut revoir ton code.

  5. #5
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    Oui , c 'est vrai que mon code de test est vraiment mauvais.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 27/04/2009, 19h49
  2. [Thread] Un père qui doit attendre la fin des fils
    Par Chatbour dans le forum Concurrence et multi-thread
    Réponses: 9
    Dernier message: 09/09/2008, 14h29
  3. [thread]attendre la fin d'un thread?....
    Par babarpapa dans le forum Concurrence et multi-thread
    Réponses: 9
    Dernier message: 29/03/2006, 14h31
  4. [Thread] Attendre la fin ...
    Par phplive dans le forum Langage
    Réponses: 2
    Dernier message: 21/03/2006, 22h29
  5. Attendre la fin des threads fils d'un processus
    Par SteelBox dans le forum Windows
    Réponses: 15
    Dernier message: 24/02/2006, 16h08

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