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 :

Threads : Synchronize


Sujet :

Langage Delphi

  1. #1
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut Threads : Synchronize
    Bonjour à tous,

    Pour les besoins d'une application, je souhaite mettre en place un thread pour effectuer une traitement. Je ne maitrise pas trop le threading mais il me semble que c'est utilisé afin de générer un traitement indépendament de la fiche actuelle (c'est grossièrement dit peut-être ).

    Donc, pour présenter vite fait l'application:
    Une fiche me permet de sélectionner une application en cours d'exécution puis d'effectuer un traitement sur celle-ci. L'application concernée est liée à une imprimante et a donc pour but de lancer des impressions. Je place dans la méthode Execute le code permettant l'automatisation des demandes d'impressions et la gestion des dossiers où sont rangés mes fichiers à imprimer.

    Dans le but de récupérer des informations sur mon traitement threadé, j'ai un objet memo dans ma fiche principale (où j'ajouterais des informations sur les traitements). J'ai donc regardé un petit exemple de code proposé par phidels.com. Dans celui-ci, on peu lire :
    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
    uses
      Classes, Sysutils;
     
    type
      TUnThread = class(TThread)
      private
        Compteur:integer;
      protected
        procedure Execute; override;
        procedure UpdateCaption;
      end;
     
    implementation
    uses ThreadUnit1;
    { Important : les méthodes et les propriétés des objets dans la VCL ne peuvent
      être utilisées que dans une méthode appelée en utilisant Synchronize, par exemple :
      Synchronize(UpdateCaption);
      où UpdateCaption pourrait être du type :
      procedure UnThread.UpdateCaption;
      begin
        Form1.Caption := 'Mis à jour dans un thread';
      end; }
     
     
    procedure TUnThread.UpdateCaption;
    begin
      Form1.LabelThread.Caption := IntToStr(Compteur);
    end;
     
    procedure TUnThread.Execute;
    begin
      Compteur:=0;
      {Pour que Terminate fonctionne, la méthode Execute du thread et toute méthode appelée
      par Execute doit tester périodiquement Terminated et quitter lorsqu'elle vaut True.}
      while  (Compteur< 10000) and not Terminated do
      begin
         inc(Compteur);
         Synchronize(UpdateCaption);
      end;
    end;
    J'ai essayer de reproduire la logique du synchronize pour mon cas, mais je me retrouve avec un problème : le thread ne connait pas From1. Je ne sais pas trop comment m'y prendre pour récupérer mes informations du coup...

    [EDIT]
    En ajoutant le Form1 aux uses de mon thread, c'est dans Form1 que j'ai un erreur : TThread non déclaré (alors qu'il est bien dans les uses...)
    [/EDIT]
    Auriez vous des pistes?

    Merci par avance,

    ZenZiTone.

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    As-tu lu la Faq ?

    On y trouve du code et des liens (tutoriels, par exemple).

    Pour ton problème, où est déclaré le Thread ? Dans la même unité que ta fiche ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Je suis allé faire un tour dans la FAQ mais j'ai pas trouvé comment fonctionnait 'Synchronize'...

    Pour répondre à ta question :

    J'ai une fiche principale SimulationClique depuis laquel je lance le thread. La seconde unité est mon thread nommée ThreadTraitementmpression. En m'aidant de l'exemple que j'ai mentionné, je créer donc un objet de type ThreadTraitementImpression dans la fiche principale.
    Pour utiliser le Synchronize, j'ai créer une procédure UpdateInfo dans l'unité ThreadTraitementImpression visant à ajouter des informations dans le TMemeo de la fiche principale. Cependant, sans le Use SimulationClique il ne reconnait pas Form1.Memo1 (ce qui parrait logique). Le fait est que si j'ajoute le use, c'est dans SimulationClique qu'il ne reconnait plus ThreadTraitementImpression.

    Du coup je pense que j'ai du zappé quelque chose...

  4. #4
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    N'as tu pas une référence d'unités circulaire ?
    Il faut bien que tu mette le uses de SimulationClique dans la partie implémentation de ThreadTraitementmpression.

  5. #5
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    N'as tu pas une référence d'unités circulaire ?

    Ne connaissant pas ce terme, j'ai fais une petite recherche et suis tombé sur un post intéressant : http://www.developpez.net/forums/d34...te-circulaire/

    Je suis également tombé sur un cours disant :
    Maintenant, si l'on fait deux unités qui font référence l'une à l'autre, mais avec une clause uses dans leurs interfaces, on obtient l'erreur de référence circulaire. En effet, pour pouvoir interpréter correctement l'interface d'une unité, il faut que le compilateur ait lu l'interface de l'autre unité, et vice-versa. Certains compilateurs ne génèrent pas d'erreur dans ces cas-là, mais en Pascal, pour le moment, une telle chose est impossible.
    Si j'ai bien compris, pour pallier à ce problème, il faut mettre le use dans la section implémentation (ce que tu disais ensuite donc).

    Il faut bien que tu mette le uses de SimulationClique dans la partie implémentation de ThreadTraitementmpression.


    Effectivement, le use SimulationClique est bien dans la partie implémentation de ThreadraitementImpression...

    Dans mon ThreadTraitementImpression ça ressemble à :
    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
    implementation
    uses SimulationClique;
     
    procedure Thread_TraitementSimulation.Execute;
    begin
     
      while wContinuer = true
        do begin
            if(FindFirst(wPath_DirSerieImpression+'\*_OK',faDirectory, searchResult)=0)
                then begin
                    TraitementFichiers;
                    DelDir(wPath_DirSerieImpression+searchResult.Name);
                    Synchronize(UpdateInfo);
                    FindClose(searchResult);
                end;
            Sleep(2000);
     
        end;
     
    end;
     
     
    procedure Thread_TraitementSimulation.UpdateInfo;
        begin
          Form1.Memo1.Text := Form1.Memo1.Text +                         
            #13#10'Dossier en cours : '+searchResult.Name
            +#13#10'Fichier en cours: '+searchResultDirSI.Name;
        end;
    Avec ce code, c'est dans SimulationClique qu'il ne reconnait pas ThreadTraitementImpression. Au passage je viens de remarquer que mon unité ne portait pas le même nom que l'objet...

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Le dernier code que tu donnes semble juste. As-tu bien dans ta fiche principale, quelque chose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    unit SimulationClique;
    
    interface 
    
    uses
      Forms, OtherUnits, ThreadTraitementImpression;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Je l'ai bien en effet ! J'ai l'impression qu'il y a un conflit entre les deux...

  8. #8
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Hum chose étonnant, suite au redémarrage du PC (micro-coupure de courant) Delphi ne signale plus l'erreur Petit bug Delphi?!

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 694
    Points : 13 130
    Points
    13 130
    Par défaut
    Citation Envoyé par ZenZiTone Voir le message
    Avec ce code, c'est dans SimulationClique qu'il ne reconnait pas ThreadTraitementImpression.
    S'il y a une déclaration du thread dans la fiche, il faut que son unité soit référencée dans le uses de l'interface.
    C'est uniquement dans l'unité du thread qu'il faut définir l'unité de la fiche dans le uses de l'implementation pour éviter la déclaration circulaire

  10. #10
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par ZenZiTone Voir le message
    Au passage je viens de remarquer que mon unité ne portait pas le même nom que l'objet...
    Ce n'est pas gênant. Delphi fait certains traitement en automatique, mais ils ne sont pas obligatoires, tu peux les changer à la main sans que ca pose de problème.
    Pour une form, dès que tu change son "name" dans l'inspecteur, il te change le nom de la classe automatiquement, a condition que ta classe était "Txxx" si ton name était "xxx".
    Autre subtilité, sur D7 en tout cas, l'IDE se base sur un commentaire dans le dpr pour connaitre la form associée à un .pas .
    sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UnitForm1 in 'UnitForm1.pas' {NameForm1},
    Le commentaire lui sert à retrouver la form (dans la liste des forms)

    Citation Envoyé par ZenZiTone Voir le message
    Hum chose étonnant, suite au redémarrage du PC (micro-coupure de courant) Delphi ne signale plus l'erreur Petit bug Delphi?!
    As-tu pensé à construire ton projet, et non pas compiler ?
    Quand tu as une erreur de ce style, la 1ere chose a faire, c'est reconstruire (la 2eme de redémarrer delphi ).

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

Discussions similaires

  1. [Thread]Synchronized
    Par soad dans le forum Concurrence et multi-thread
    Réponses: 15
    Dernier message: 10/10/2005, 20h16
  2. [Thread][synchronized] Pb d'executions simultanees d'une methode
    Par Higestromm dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 02/09/2005, 12h04
  3. [Thread][SYNCHRONIZED] problème de synchornisation
    Par _Eric_ dans le forum Général Java
    Réponses: 9
    Dernier message: 15/03/2005, 10h59
  4. [thread] synchronize ou pas ?
    Par dvarrel dans le forum Langage
    Réponses: 4
    Dernier message: 26/07/2004, 19h09
  5. [Thread] Synchronize
    Par Pedro dans le forum Langage
    Réponses: 9
    Dernier message: 06/07/2004, 13h30

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