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 :

Communication entre deux Threads


Sujet :

Langage Delphi

  1. #1
    Membre averti

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

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut Communication entre deux Threads
    Salut a tous

    Je me suis lancer dans la programmation avec les threads, et je bloque un peu sur la communication entre deux threads.

    Je vous explique:

    J'ai un thread qui tourne et qui gere un port série et de temps en temps il incremente une variable.
    J'ai un autre thread qui lui doit récupérer la valeur de la variable du premier thread, faire un traitement et l afficher dans un TCHAT. Bien entendu il ne doit pas arreter l'autre thread.

    Comment dois je faire ??
    Je dois utiliser un mutex ??

    J'ai lu le cours de Laurent Berne (excellent cours) qui n'utilise pas de méthode de synchronise pour accéder a des composant de la vcl hors du thread.

    Je me perd un peu dans tout cela.

    Merci d avance

  2. #2
    Membre éprouvé
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Points : 957
    Points
    957
    Par défaut
    le meilleur moyen de communication entre deux thread est de passer par les section critique et les threadvars
    http://www.pocketmt.com GLCD Font Creator home site.

  3. #3
    Membre averti

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

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    et tu fais comment tu as un exemple ?

  4. #4
    Membre averti

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

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    Personne ne sait comment il faure fair e?

  5. #5
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Utilisation des sections critiques :
    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
    type
      TThread1 = class
      private
        FCounter : integer;
        FCounterCriticalSection;
        function GetCounter : integer;
        procedure IncCounter;
      public
        property Counter : integer read GetCounter;
      end;
     
    implementation
     
    function TThread1.GetCounter : integer;
    begin
      FCounterCriticalSection.Acquire;
      try
        Result := FCounter;
      finally
        FCounterCriticalSection.Leave;
      end;
    end;
     
    procedure TThread1.IncCounter;
    begin
      FCounterCriticalSection.Acquire;
      try
        inc(FCounter);
      finally
        FCounterCriticalSection.Leave;
      end;
    end;
    N'oublie pas de créer FCounterCriticalSection dans le constructeur et de le libérer dans le destructeur.

    Et n'oublie pas non plus le bouton
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  6. #6
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    salut
    voir: http://www.phidels.com/php/index.php3?page=../php/pagetelechargementzip.php3&id=336
    c'est un bon example pour les section critique

    une question: votre 2éme thréade utilise la valeur aprés incrémentation ou a des intevals ou quand?
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  7. #7
    Membre averti

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

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    aprés incrementation

  8. #8
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut Re: Communication entre deux Threads
    Citation Envoyé par rvzip64
    J'ai un thread qui tourne et qui gere un port série et de temps en temps il incremente une variable.
    J'ai un autre thread qui lui doit récupérer la valeur de la variable du premier thread, faire un traitement et l afficher dans un TCHAT. Bien entendu il ne doit pas arreter l'autre thread.
    Vous êtes tous des grosses brutes !!! ;-)

    Plus sérieusement, c'est vrai que les sections critiques sont de rigueur lorsque les données à manipuler sont complexes et/ou d'assez grande taille.

    Mais pour une synchro aussi simple que celle-là, l'API Win32 te fournit déjà des fonctions atomiques !
    Celle que tu vas utiliser à priori sera InterlockedIncrement pour ton incrémentation.
    Pour la "lecture", tu utilisera InterlockedCompareExchange avec une valeur à zéro pour la valeur échangée.
    Ainsi, ton thread 1 incrémente sa variable tranquillement, et le thread 2 va lui "piquer" cette variable et la remettre à zéro au passage.
    Si tu dois conserver la somme totale, c'est dans le thread 2 qu'il faut la conserver.

    Ces fonctions existent aussi en Delphi, bien sûr, il me semble qu'elles sont dans l'unité Windows.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  9. #9
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Whaou ! Où t'as été pêcher ça ?
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  10. #10
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par sjrd
    Whaou ! Où t'as été pêcher ça ?
    Bon, une perche pareille, je ne peux pas la refuser : j'en dormirai pas pendant des semaines et je suis déjà insomniaque...

    ;-)

    Plus sérieusement, j'ai pas mal épluché l'aide "Win32 Reference", fournie avec Delphi (menu Help | Windows SDK), pour des éléments comme le ShellExecute ou GetIpAddrTable, etc, etc... En plus, j'ai aussi à bosser sur eMbedded Visual C++, et là, c'est "API-only".

    A force, tu te rends très vite compte que non seulement tous les types Windows "C" sont définis dans Delphi, mais la plupart des fonctions aussi (les exceptions comme GetIpAddrTable sont rares, et concernent presque toutes le Platform SDK).
    Donc, quand j'ai un problème que la VCL ne peut (apparemment) pas résoudre, j'ai pris l'habitude de faire cette démarche :
    - Chercher sur MSDN les fonctions Win32 correspondantes,
    - Chercher dans les sources de la VCL les appels à ces fonctions,
    - Regarder dans quelles fonctions/classes VCL c'est fait.

    C'est comme ça, par exemple, que j'ai "découvert" la classe TMultiReadExclusiveWriteSynchronizer (TMREWSync en abrégé), qui est sinon relativement difficile à trouver "comme ça".
    Ou encore qu'il est plus pratique d'utiliser les sections critiques de l'OS (RTL_CRITICAL_SECTION) car ce sont des enregistrement, possédant un champ... LockCount ! Or, par défaut, on ne peut pas connaître l'état (pris ou libre) d'un TCriticalSection (gênant).
    L'API Win32 fournit une fonction nommée TryEnterCriticalSection, qui permet de pallier ce problème.
    Bref, que du bonheur ! ;-)
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  11. #11
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    salut
    alors pourqoi pas fait ton trétement dans l'evenemnt meme du port série comme sa tu utilisera un seul tréad
    tu as pas deux traitement vraiment séparé la 2éme est lier par la premiére :c'est une idée c'est tt
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  12. #12
    Membre averti

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

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    donc ca veut dire que si maintenant je veux partager un tableau de valeur entre les deux threads je dois faire comment ?

    Les sections critique ne me plaisent pas trop, en effet, ça arrete les autres thread du processus et je ne peux pas me le permettre, vu que le programme est "temps reel" et j ai donc de nombreuse contrainte.

  13. #13
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par rvzip64
    donc ca veut dire que si maintenant je veux partager un tableau de valeur entre les deux threads je dois faire comment ?
    Tu peux par exemple utiliser les Interlocks sur les éléments du tableau. Attention à ne pas confondre, cependant : les Interlocks servent à échanger une variable (max : 32 bits) entre des threads, pas des tableaux ou des enregistrements. Tu peux par contre les utiliser sur des membres d'enregistrement ou des éléments de tableau, à condition bien sûr qu'il ne soit pas nécessaire de faire plusieurs opérations simultanément pour maintenir le tableau/enregistrement cohérent.

    Citation Envoyé par rvzip64
    Les sections critique ne me plaisent pas trop, en effet, ça arrete les autres thread du processus et je ne peux pas me le permettre, vu que le programme est "temps reel" et j ai donc de nombreuse contrainte.
    Faux : les CS (ou mutex) ne bloquent que les threads qui les utilisent, et uniquement s'ils entrent en concurrence. Souvent, ça arrive au lancement des threads, puis ils se "régulent" plus ou moins et entrent de moins en moins souvent en concurrence si tu as correctement conçu ton algo.

    Un Interlock fait la même chose qu'un mutex, simplement c'est sur une opération tellement courte que ça ne se voit pas, c'est tout.
    Comme je l'ai mentionné un peu plus haut, tu peux aussi utiliser une synchro Lecteurs/Rédacteur si tu fait plus souvent de la lecture que de l'écriture. Si les deux opérations sont équiprobables, une CS ou un mutex sont requis.

    Différence : une CS est locale à un processus, et est plus rapide à prendre qu'un mutex. Le mutex, par contre, est global au système et peut donc être partagé entre deux processus distincts.
    Si les données à échanger de manière atomique sont plus grandes que 32 bits, un système de synchro par CS ou mutex est impératif.

    Je fais du temps réel tous les jours, et j'utilise pourtant un paquet de systèmes de synchro : ça n'est pas incompatible (tu confonds "temps réel" et "temps critique").

    Ta solution est donc :
    - Les valeurs du tableau sont totalement indépendantes les unes des autres et ne sont rangées dans un tableau que par commodité : utilise un Interlock sur les éléments du tableau.
    - Le tableau est une entité à part entière, les valeurs contenues doivent évoluer simultanément : la CS est de rigueur.
    - Le tableau est une "file" d'évènements consignés, cette file devant être "purgée" vers un autre thread : utiliser un Interlock sur le pointeur pour échanger les buffers.

    Ca répond à tes questions ?
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  14. #14
    Membre averti

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

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    oui la je crois que cela repond a toute mes questions, c est trés clair, je te remercie.

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

Discussions similaires

  1. Communication entre deux threads
    Par cyberspy2999 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 03/03/2011, 16h12
  2. Communication entre deux threads
    Par floriaan60 dans le forum C#
    Réponses: 10
    Dernier message: 24/11/2010, 16h50
  3. Communication entre deux Executables ?
    Par QAYS dans le forum Langage
    Réponses: 8
    Dernier message: 11/05/2005, 14h41
  4. communication entre deux executables
    Par semenzato dans le forum MFC
    Réponses: 8
    Dernier message: 13/04/2005, 22h19
  5. Réponses: 5
    Dernier message: 25/03/2003, 19h43

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