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

Delphi Discussion :

Petite question sur les Threads et WaitFor


Sujet :

Delphi

  1. #1
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 871
    Points : 1 247
    Points
    1 247
    Par défaut Petite question sur les Threads et WaitFor
    Bonjour,

    J’ai une boucle For, dans laquelle il y a un MyThread.Start, suivi d’un MyThread.WaitFor.

    Entre chaque itération, je modifier des paramètres pour le traitement de MyThread.Exécute.

    A la première itération de ma boucle RAS, mais à la seconde itération de ma boucle, comment je relance MyThread ?

    Le débogguer râle sur MyThread.Start, alors je doit sûrement oublier quelque chose, auriez-vous une idée de solution ?

    Je vous remercie par avance de vos retours.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 830
    Points : 13 574
    Points
    13 574
    Par défaut
    Tu ne peux pas le redémarrer. Le thread Windows est automatiquement libéré à la sortie de Execute.

    Soit tu recrées un TThread à chaque itération, soit tu passes par des events, lus en boucle dans un while not terminated do.

  3. #3
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 871
    Points : 1 247
    Points
    1 247
    Par défaut
    Je ne comprend l’approche avec les events, aurais tu un example explicatif ?

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 830
    Points : 13 574
    Points
    13 574
    Par défaut
    Un exemple par event :
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    program Project1;
     
    {$APPTYPE CONSOLE}
     
    {$R *.res}
     
    uses System.SysUtils, System.Classes, System.SyncObjs, Winapi.Windows;
     
    type
      TMyThread = class(TThread)
      protected
        procedure Execute; override;
        procedure TerminatedSet; override;
      end;
     
    var
      StartEvent :TEvent;
      EndEvent   :TEvent;
     
    { TMyThread }
     
    procedure TMyThread.Execute;
    begin
      while not Terminated do
      begin
        StartEvent.WaitFor;
     
        if not Terminated then
        begin
          Winapi.Windows.Beep(500, 100);
          Sleep(2000);
          Winapi.Windows.Beep(600, 100);
        end;
     
        EndEvent.SetEvent;
      end;
    end;
     
    procedure TMyThread.TerminatedSet;
    begin
      StartEvent.SetEvent;
      inherited;
    end;
     
    begin
      var Thread := TMyThread.Create;
     
      StartEvent := TEvent.Create(nil, FALSE, FALSE, '');
      EndEvent   := TEvent.Create(nil, FALSE, FALSE, '');
     
      for var i := 1 to 5 do
      begin
        WriteLn('Démarrage');
        StartEvent.SetEvent;
     
        WriteLn('Attente');
        EndEvent.WaitFor;
     
        WriteLn('Terminé');
        WriteLn;
     
        Sleep(1000);
      end;
     
      Thread.Free;
      StartEvent.Free;
      EndEvent.Free;
    end.
    Ou une autre version sans event avec un WakeByAddress.
    L'avantage est qu'on a pas besoin de se préoccuper de la durée de vie des events.

    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
    56
    57
    58
    59
    60
    61
    62
    program Project1;
     
    {$APPTYPE CONSOLE}
     
    {$R *.res}
     
    uses System.SysUtils, System.Classes, Winapi.Windows, WakeEvents;
     
    type
      TMyThread = class(TThread)
      protected
        procedure Execute; override;
        procedure TerminatedSet; override;
      end;
     
    var
      StartEvent :TWakeEvent;
      EndEvent   :TWakeEvent;
     
    { TMyThread }
     
    procedure TMyThread.Execute;
    begin
      while not Terminated do
      begin
        StartEvent.Wait;
     
        if not Terminated then
        begin
          Winapi.Windows.Beep(500, 100);
          Sleep(2000);
          Winapi.Windows.Beep(600, 100);
        end;
     
        EndEvent.SetEvent;
      end;
    end;
     
    procedure TMyThread.TerminatedSet;
    begin
      StartEvent.SetEvent;
      inherited;
    end;
     
    begin
      var Thread := TMyThread.Create;
     
      for var i := 1 to 5 do
      begin
        WriteLn('Démarrage');
        StartEvent.SetEvent;
     
        WriteLn('Attente');
        EndEvent.Wait;
     
        WriteLn('Terminé');
        WriteLn;
        Sleep(1000);
      end;
     
      Thread.Free;
    end.

  5. #5
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 871
    Points : 1 247
    Points
    1 247
    Par défaut
    Mille mercis Andnotor, j'ai compris, l'idée, je vais pouvoir moduler selon mes besoins

    Si je comprend bien TEvent et TWakeEvent sont Treadsafe, et il me suffit de défini l'event dans un module hors classe et accessible au 2 threads...

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

Discussions similaires

  1. Question sur les threads
    Par Linio dans le forum Concurrence et multi-thread
    Réponses: 10
    Dernier message: 21/10/2005, 10h08
  2. Question sur les threads
    Par nicolas66 dans le forum MFC
    Réponses: 4
    Dernier message: 03/06/2005, 21h57
  3. [ATL] Petite question sur les progress bar
    Par MrMaze dans le forum MFC
    Réponses: 1
    Dernier message: 06/05/2005, 10h40
  4. Réponses: 3
    Dernier message: 08/12/2004, 14h58
  5. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 14h49

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