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 :

Comment partager un TStringList entre plusieurs threads ?


Sujet :

Langage Delphi

  1. #1
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut Comment partager un TStringList entre plusieurs threads ?
    Bonjour,

    Comment dois-je faire pour partager un TStringList de mon application entre plusieurs threads de manière à ce que les modifications de cette TStringList ne soient pas réalisées en même temps.

    Merci,
    ZiP

  2. #2
    Membre averti
    Avatar de delphichem
    Inscrit en
    Octobre 2002
    Messages
    280
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 280
    Points : 338
    Points
    338
    Par défaut
    Si tu utilises un TThread, tu peux utiliser la méthode Synchronize, sinon tu peux utiliser des sections critiques.

  3. #3
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Il serait bien de nous dire ce que tu veux faire avec cette TStringList et ces threads

  4. #4
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    En fait, je souhaite partager une TStringList entre plusieurs thread afin que je puisse ajouter et supprimer de lignes dans cette TStringList depuis n'importe quel thread.

  5. #5
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par [ZiP] Voir le message
    En fait, je souhaite partager une TStringList entre plusieurs thread afin que je puisse ajouter et supprimer de lignes dans cette TStringList depuis n'importe quel thread.
    Oui, oui, ça on a compris, mais concrètement ton programme il va faire quoi ?

    Car autant tu prends une mauvaise direction en voulant absolument que les threads lisent dans la TStringList alors qu'autant tu pourrais faire en sorte que ce soit la TStringList qui contrôle les Threads.

  6. #6
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    Les threads liront des pages Internet, et placerons les liens trouvés dans une TStringList globale.
    Chaque thread supprimera la première ligne de la liste afin de l'utiliser.

    J'espère avoir été assez clair.

    ZiP

  7. #7
    Membre averti
    Avatar de delphichem
    Inscrit en
    Octobre 2002
    Messages
    280
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 280
    Points : 338
    Points
    338
    Par défaut
    Tu peux créer une méthode pour ton thread pas ex: SyncList:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function TMonThread.SyncList;
    begin
      Result := '';
      if SL.Count > O then
      begin
        Result := SL[0];
        SL.Delete(0);
      end;
    end;
    Et dans ton code tu fait appel a cette methode par le biais de

  8. #8
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    Faut-il quand même que j'utilise des sections critiques afin d'éviter des erreurs ?

    ZiP

  9. #9
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 290
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 290
    Points : 1 941
    Points
    1 941
    Par défaut
    C'est le travail du Synchronize normalement.

  10. #10
    Membre expérimenté

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    Le plus simple pour moi (non 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
    class TThreadedStringList = class (TStringList)
    private:
      FLockCS: TCriticalSection;
    public:
      procedure Lock();
      procedure Unlock();
    end;
     
    procedure TThreadedStringList.Lock()
    begin
      FLockCS.Acquire;
    end;
     
    procedure TThreadedStringList.Unlock()
    begin
      FLockCS.Release;
    end;
    et dans ton code, avant tu encadres les sections qui manipulent tes strings list de Lock() et Unlock() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
    MySL.lock();
    try
    ...
    finally
      MySL.Unlock();
    end;
    Je pense qu'il est mieux quand on peut d'éviter de faire appel à Synchronize. La méthode la plus simple de synchronisation, c'est les sections critiques...

  11. #11
    Membre averti
    Avatar de delphichem
    Inscrit en
    Octobre 2002
    Messages
    280
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 280
    Points : 338
    Points
    338
    Par défaut
    Citation Envoyé par Linkin Voir le message
    C'est le travail du Synchronize normalement.
    Oui c'est exactement ça.

  12. #12
    Membre expérimenté

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    Synchronize() n'est pas une primitive de synchronisation comme en Java. C'est un bricolage qui permet de faire exécuter une procédure au thread principal en utilisant les messages Windows. Il y a de nombreux cas ou Synchronize() ne fonctionnera pas (applications console, etc.) et de nombreux bugs qui vont avec (lire les newsgroups anglophones). Tu fais ce que tu veux, mais personnellement je te conseille d'utiliser de vrais objets de synchro pour faire de la synchro

  13. #13
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 290
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 290
    Points : 1 941
    Points
    1 941
    Par défaut
    Content de le savoir, c'est vrai que je m'étais basé sur le fonctionnement du Synchronize de Java

  14. #14
    Membre averti
    Avatar de delphichem
    Inscrit en
    Octobre 2002
    Messages
    280
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 280
    Points : 338
    Points
    338
    Par défaut
    J'utilise synchronize dans tous mes programmes multi threader, je n'ai "encore" jamais eu de problèmes, peux être ont ils étaient corrigé sur RAD studio 2007?
    Mais merci pour l'info, j'envisagerai dans mes future développement de m'en passer.

  15. #15
    Membre expérimenté

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    Ce n'est pas vraiment des bugs, mais plus des soucis de conception qui sont propices à des deadlocks. J'ai retrouvé un thread sur google qui en parle :
    http://newsgroups.cryer.info/borland...707318688.html

    Personnellement, j'utilise synchronize() sous D2007 sans problème. Mais je me cantonne à son utilisation de base : poster une demande d'exécution de procédure au thread principal. Dans le post, on voulait rendre un objet threadsafe, et non déférrer tous les accès aux thread principal, c'est pour cela qu'un objet de synchro est suffisant...

Discussions similaires

  1. Comment partager un calendrier entre plusieurs personnes
    Par beegees dans le forum Exchange Server
    Réponses: 6
    Dernier message: 18/12/2008, 13h59
  2. partager l'instance d'une classe entre plusieurs thread ?
    Par contremaitre dans le forum Threads & Processus
    Réponses: 5
    Dernier message: 29/07/2008, 11h53
  3. partage d'une variable entre plusieurs threads
    Par baedal dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 27/02/2008, 20h33
  4. [WinForms]Comment partager des objets entre threads ?
    Par AiSpirit dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 16/08/2006, 08h57
  5. Comment partager les ressources entre 2 threads?
    Par remimichot dans le forum Concurrence et multi-thread
    Réponses: 7
    Dernier message: 29/12/2005, 09h17

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