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 :

Boucle non bloquante


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 22
    Points : 12
    Points
    12
    Par défaut Boucle non bloquante
    Bonjour,

    J'aimerai créer une boucle non bloquante pour mon application, mais je n'y arrive pas . je m'explique: j'ai deux classes, un TComponent et un TThread.
    Dans ma classe TComponent j'instancie et utilise mon thread. Le probleme c'est que je veux créer une boucle de test pour determiner quand mon thread est terminé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Destructor TPosteDecoupeWafer.Destroy;
    begin
      // destruction thread
      with thread do
      begin
        if not threadTerminated then
        begin
          Terminate;
          while not threadTerminated do
            sleep(10);       // boucle bloquante
        end;
        Free;
      end;
    Y aurait t'il une solution pour que la boucle ne bloque pas l'application?? (Comme application.processMessages)

    Merci d'avance pour vos résponses!

    Ced

  2. #2
    Membre habitué Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Points : 174
    Points
    174
    Par défaut
    slt...
    le timer ne t'aiderait pas la dessus???

  3. #3
    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,

    Utiliser un timer avec dans son event :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    timer1.enabled:=false ;
    if threadTerminated then thread.free else timer1.enabled:=true ;

  4. #4
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    bé en fait je voit ce que vous voulez dire mais le probleme c'est que je veux pas qu'elle soit bloquante dans mon application (d'autre thread qui tourne) mais il faut qu'elle le soit dans ma procedure (ici mon destroy). Car si je detruit des objets qui sont utiliser par mon thread (avant qu'il soit detruit), sa va planter :/ vous comprenez ce que je veux dire??

    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
     
     
    Destructor TPosteDecoupeWafer.Destroy;
    begin
      // destruction thread
      with thread do
      begin
        if not threadTerminated then
        begin
          Terminate;
          while not threadTerminated do
            sleep(10);       // boucle bloquante
        end;
        Free;
      end;
     
      FTcpFins.Free;
      FAdresseMotDialogue.Free;
      FAdresseCoordonneeX.Free;
      FAdresseCoordonneeY.Free;
      FAdresseOffsetX.Free;
      FAdresseOffsetY.Free;
      FAdresseOrigineAxeX.Free;
      FAdresseOrigineAxeY.Free;
      if Assigned(FSuiviOffsetWafer) then
        Finalize(FSuiviOffsetWafer);
      inherited;
    end;

  5. #5
    Dry
    Dry est déconnecté
    Membre du Club

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 48
    Points : 50
    Points
    50
    Par défaut
    je te suggère ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while not threadTerminated do
    begin
       Application.ProcessMessages;
       sleep(1);
    end;
    Bon dev,
    Dry

  6. #6
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Bonjour Dry,

    Je peux pas utiliser application.ProcessMessages étant donner que je me "trouve" dans une classe, a moins que je crée une variable locale TApplication juste pour utiliser le processMessages, je sais pas sa ma pas l'air trop propre comme code :/. Foutu thread...

  7. #7
    Dry
    Dry est déconnecté
    Membre du Club

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 48
    Points : 50
    Points
    50
    Par défaut
    il me semble qu'en faisant un :
    ca devrait te permettre d'utiliser la variable globale Application.

    Dry

  8. #8
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    yes merci man,

    en fait j'utiliser forms mais je crée une nouvelle variable TApplication, alors que c'est pas la peine :p. Enfin bref sa marche voici la solution pour ce qui rencontrerons le même problème:

    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
     
    destructor TPosteFour.destroy;
    begin
      // destruction thread
      with thread do
      begin
        if not threadTerminated then
        begin
          Terminate;
          while not threadTerminated do
            application.processMessages;
        end;
        Free;
      end;
     
      FTcpFins.Free;
      timerAcquisition.Enabled:= false;
      timerAcquisition.free;
      FAdresseMotDialogue.free;
      FAdresseConsigneTemperature.free;
      FAdresseTempsCycle.free;
      FAdresseTemperature.free;
      if Assigned(FSuiviTemperature) then
        Finalize(FSuiviTemperature);
      inherited;
    end;

  9. #9
    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,

    et en modifiant le code de l'event timer ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    timer1.enabled:=false ;
    if threadTerminated 
       then begin 
         thread.free 
     
         FTcpFins.Free;
         FAdresseMotDialogue.Free;
         FAdresseCoordonneeX.Free ;     FAdresseCoordonneeY.Free;
         FAdresseOffsetX.Free     ;     FAdresseOffsetY.Free;
         FAdresseOrigineAxeX.Free ;     FAdresseOrigineAxeY.Free;
         if Assigned(FSuiviOffsetWafer) then
            Finalize(FSuiviOffsetWafer);
         end 
    else timer1.enabled:=true ;

  10. #10
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Oui sa doit fonctionner aussi mais sa m'embeter de créer un timer pour arreter un thread, mais ta solution marche aussi. Le destructeur deviendrais mon timer en fait. Je prefere l'autre méthode avec l'appel de processMessages de l'application.


    Merci a tous pour vos reponses

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

Discussions similaires

  1. Boucle non bloquante
    Par may95 dans le forum Général Python
    Réponses: 7
    Dernier message: 05/06/2014, 11h27
  2. Réponses: 5
    Dernier message: 02/09/2005, 12h47
  3. Rendre la lecture non bloquante
    Par Charlinecha dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 05/07/2005, 15h46
  4. Réponses: 3
    Dernier message: 16/03/2004, 16h42
  5. [API] Communication série NON-bloquante : OVERLAPPED/Thread
    Par Rodrigue dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/11/2003, 13h43

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