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

API, COM et SDKs Delphi Discussion :

[Multi-threading] Communication d'enregistrements entre threads


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Par défaut [Multi-threading] Communication d'enregistrements entre threads
    Bonjour à tous,


    Je vais essayer d'expliquer le plus simplement :

    Soient deux thread : thread1 et thread2.
    Soit un record :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    monRecord = record
         heure: TDateTime;
         distance: integer;
         sauver: boolean;
       end;
    Comment faire pour que thread1 génère un monRecord avec des valeurs définies et qu'il l'envoie à thread2 ?

    Je me suis évidemment penché sur la méthode PostThreadMessage mais j'ai du mal à comprendre :
    Premier paramètre l'handle de thread2 => ok
    Deuxième paramètre => un identifiant de mon message. Est-ce que comme ça c'est bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const
    WM_INFOTHREAD1 = WM_USER + 1;
    ?
    Troisième et quatrième paramètre ... Et voila .... je pense bien que c'est par là que je dois mettre mon record .... mais comment ?




    Ensuite,
    côté thread2, je dois bien, dans ma boucle principale faire simplement appel à PeekMessage ?





    Par avance, merci pour votre aide

  2. #2
    Membre éclairé
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Par défaut
    Je viens de trouver ça -> Spécial Delphi - Michel


    Seulement i utilise SendMessage et par conséquent son record existe toujours en mémoire, or moi je voudrais pouvoir utiliser PostMessage (ou PostThreadMessage) pour que thread1 n'attende pas que thread2 ait traité le message (et d'ailleurs ... alors même que thread2 n'a pas traité le message de thread1, je voudrais que thread1 soit capable d'en envoyer d'autres à thread2) ...

    Je voudrais en simple, créer une file de message dont le message est un record ...




    Merci à quiconque m'aidera

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 030
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 030
    Par défaut
    Tu peux aussi générer tes record (via pointeur), et les entreposer dans une TThreadList, consulter celle-ci dans le second thread, et libérer les items traiter ...

    c'est nettement moins prise de tête que les messages windows ... qui fonctionne comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    type
      PBleysThreadRecord = ^TBleysThreadRecord;
      TBleysThreadRecord = record
         heure: TDateTime;
         distance: integer;
         sauver: boolean;
       end;
    Listener
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var
      Msg: TMsg;
    begin
    while not Terminated do
    begin
      Sleep(5);
      if GetMessage(Msg, 0, WM_INFOTHREAD1, WM_INFOTHREAD1) then
      begin
        // Gère Msg
        S := FormatDateTime('HH:SS:NN', PBleysThreadRecord(Msg.wParam)^.Heure);
        Dispose(PBleysThreadRecord(Msg.wParam)); // Libération
      end;
    end;
    Sender
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var
      monRecordPtr: PBleysThreadRecord;
    begin
      New(monRecordPtr);
      monRecordPtr^.Heure := Now();
      ...
    PostThreadMessage(HandleThread2, WM_INFOTHREAD1, Integer(monRecordPtr), 0); // Ne plus utilisé monRecordPtr, 
    end;
    Si tu loupes des messages, on ne sait jamais, je n'ai pas utilisé PostThreadMessage pour des mécanismes essentiels de mes applications, lui préférant la ThreadList, tu peux avoir des fuites mémoires, dans ce cas, stocker les Pointers, et leur affecter une date de péremption pour les libérer ... mais gare au violation d'accès ...
    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

  4. #4
    Membre éclairé
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Par défaut
    Tu es si bon ShaiLeTroll ...



    J'avais pensé au TList modifié pour les threads un peu comme le TThreadStringList,
    Mais en y réfléchissant bien, ça doit bien exister quelque part tout fait déjà cette unité ...


    Je vais me pencher là dessus ... Ce qui évitera de gérer les messages windows, certainement plus lourd à gérer (mais plus performant peut-être ?)



    Encore merci à toi

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 030
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 030
    Par défaut
    la TThreadStringList, je ne l'a connaissais pas celle là ? c'est depuis quel Delphi ? sinon la TThreadList (Classes.pas), existe depuis au moins Delphi 5 ...

    Côté performance, à mon avis, cela ne doit pas changer grand chose sur les machines que nous avons, tant que ta liste ne contient pas quelques milliers d'items ... mais autant le gérer soit-même, autant maîtriser sa mémoire

    en général, je fixe une capacity à 1024 messages, puis lorsque cela approche de ce chiffre, je lance un Pack(), car je ne fais pas de delete sur la liste, mais j'affecte nil, ainsi cela reduit les mouvements en mémoire ...
    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
    Membre éclairé
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Par défaut
    La TThreadStringList je l'ai trouvé sur internet en fait ... sur un tuto de développez d'ailleurs ...

    Quand à TThreadList, malheureusement pour moi je suis sous Delphi 4 ... du coup je l'ai ré-implémenté ... ou tout du moins, ce qui m'intéressait ....



    Merci pour tout et je prends note pour ta remarque de fin

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

Discussions similaires

  1. [XL-2007] Format commun d'enregistrement entre Excel 2003 et 2007
    Par poporte dans le forum Excel
    Réponses: 6
    Dernier message: 27/08/2014, 09h03
  2. Communication d'objets entre threads
    Par richard_sraing dans le forum Général Java
    Réponses: 2
    Dernier message: 26/04/2013, 15h36
  3. Réponses: 2
    Dernier message: 29/04/2007, 19h59
  4. Communication entre thread
    Par JFPS Soft dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 03/02/2006, 17h38
  5. [c#][threading] communication entre threads
    Par orelero dans le forum C#
    Réponses: 6
    Dernier message: 02/01/2006, 00h42

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