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 :

TCriticalSection : j'ai besoin d'un conseil pour son bon usage !


Sujet :

Delphi

  1. #1
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    768
    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 : 768
    Points : 960
    Points
    960
    Par défaut TCriticalSection : j'ai besoin d'un conseil pour son bon usage !
    Bonjour,

    A votre avis, dans un setter, est-il risqué de faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TStefThread.SetGroupage(Value: Boolean);
    begin
      if FGroupage <> Value then
      begin
        FLogLock.Enter;
        try
          FGroupage := Value;
        finally
          FLogLock.Leave;
        end;
      end;
    end;
    Ou plutôt, impérativement, comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TStefThread.SetGroupage(Value: Boolean);
    begin
      FLogLock.Enter;
      try
        if FGroupage <> Value then
          FGroupage := Value;
      finally
        FLogLock.Leave;
      end;
    end;
    Est-il judicieux de "consommer" un TCriticalSection, si le test "FGroupage <> Value" renvoi FALSE ?

  2. #2
    Expert confirmé Avatar de sergio_is_back
    Homme Profil pro
    Responsable informatique, développeur tout-terrain
    Inscrit en
    Juin 2004
    Messages
    1 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable informatique, développeur tout-terrain
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 089
    Points : 5 637
    Points
    5 637
    Par défaut
    La question n'est pas de "consommer" ou pas un TCriticalSection (qui n'est qu'un simple verrou en réalité)
    La question c'est à quoi sert ce test ?
    Si Value=FGroupage alors la valeur ne change pas !!! Du coup quel est l'intérêt de ce test dans les deux cas ?

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 710
    Points : 13 174
    Points
    13 174
    Par défaut
    La logique est de protéger la lecture et l'écriture puisque dans le premier exemple FGroupage pourrait déjà avoir changé entre le test et le verrou.

    Et ne pas oublier de le faire au niveau du getter aussi. Protéger uniquement le setter n'aurait pas de sens

  4. #4
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    768
    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 : 768
    Points : 960
    Points
    960
    Par défaut
    Si je comprend bien il faut protéger la variable même en lecture seul.

    Merci pour vos réponses.

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 469
    Points : 24 905
    Points
    24 905
    Par défaut
    Sinon plus compact InterlockedExchange ou AtomicExchange et InterlockedCompareExchange avec le type BOOL (LongBool)

    Même si pour un Boolean, avec seulement deux états, la collision de valeur c'est plus savoir si il y a eu rétention lors du Setter.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Expert confirmé Avatar de sergio_is_back
    Homme Profil pro
    Responsable informatique, développeur tout-terrain
    Inscrit en
    Juin 2004
    Messages
    1 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable informatique, développeur tout-terrain
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 089
    Points : 5 637
    Points
    5 637
    Par défaut
    Citation Envoyé par der§en Voir le message
    Si je comprend bien il faut protéger la variable même en lecture seul.

    Merci pour vos réponses.
    Normalement OUI !

    L'utilisation de CriticalSection.Enter & Release n'est pas forcément très pénalisant, sauf si tu beaucoup de threads et que tu souhaite te rapprocher du temps réel, ou avoir des temps de cycle extrêmement courts

  7. #7
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    768
    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 : 768
    Points : 960
    Points
    960
    Par défaut
    Citation Envoyé par sergio_is_back Voir le message
    Normalement OUI !

    L'utilisation de CriticalSection.Enter & Release n'est pas forcément très pénalisant, sauf si tu beaucoup de threads et que tu souhaite te rapprocher du temps réel, ou avoir des temps de cycle extrêmement courts
    C’est exactement, ma problématique, d’où ma question !

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 469
    Points : 24 905
    Points
    24 905
    Par défaut
    Sinon un MREWS ?
    Optimise la lecture fréquente ... mais faut pas imbriquer les verrous de lecture et d'écriture, faut mieux les séparer ce qui implique une double lecture

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TStefThread.GetGroupage(): Boolean;
    begin
      FLogMREWS.BeginRead;
      try
        Result := FGroupage;
      finally
        FLogMREWS.EndRead;
      end;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TStefThread.SetGroupage(Value: Boolean);
    begin
      if GetGroupage() <> Value then // verrou en lecture
      begin
        FLogMREWS.BeginWrite; // Si cela se trouve, le BeginWrite a attendu qu'un autre thread modifie la valeur !
        try
          if FGroupage <> Value then // Un thread doit toujours supprimer les échantillons précédents de la mémoire protégée après avoir transformé un verrou de lecture en verrou d'écriture, ce qui est ce cas
            FGroupage := Value;
        finally
          FLogMREWS.EndWrite;
        end;
      end;
    end;



    Après le modèle des Setters de la VCL ou FMX où l'on teste avant d'affecter est surtout parce que l'affectation peut déclencher des choses, par exemple invoquer l'API Windows

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          if FGroupage <> Value then
            FGroupage := Value;
    le code est souvent plus complexe car le Setter appelle une autre méthode comme par exemple AdjustGroupage, le test évite l'appel inutile si la valeur n'a pas changé ..; tu aurais un code de ce type, le test de lecture me semblerait important mais là, est-ce que cela change quelques chose d'écrire la valeur si c'est déjà la même ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
          if FGroupage <> Value then
         begin
            if Assigned(OnBeforeChangeGroupage) then OnBeforeChangeGroupage(Self, FGroupage, Value);
            FGroupage := Value;
            AdjustGroupage();
            if Assigned(OnAfterChangeGroupage) then OnAfterChangeGroupage(Self, FGroupage, Value);
         end;



    Sinon, il existe aussi TMonitor.Enter
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  9. #9
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    une façon simple de régler ce problème (mais je ne sais pas si elle s'applique à ta problématique) est de ne mettre à jour la valeur que depuis le Thread principal et donc de passer par TThread.Synchronize pour le mettre à jour
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

Discussions similaires

  1. J'ai besoin de vos conseils pour mon site chez-Gaëlle
    Par Gaëlle71 dans le forum Mon site
    Réponses: 2
    Dernier message: 30/04/2007, 23h09
  2. Réponses: 4
    Dernier message: 17/04/2007, 19h04
  3. [Mail] Besoin d'un conseil pour l'envoi d'e-mail
    Par olive_le_malin dans le forum Langage
    Réponses: 1
    Dernier message: 21/12/2006, 11h39
  4. Besoin de quelques conseils pour un script java
    Par poussin544 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 02/03/2006, 10h41
  5. Besoin d'un conseil pour une sélection Access/fichier
    Par Oluha dans le forum Bases de données
    Réponses: 1
    Dernier message: 20/03/2005, 19h10

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