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

  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 093
    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 093
    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 093
    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 093
    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

  7. #7
    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 devais vraiment �tre dans les vappes ce jour l� ... TThreadList existe bien sous Delphi 4 ... Pourquoi ne me l'avait-il pas trouv� avant ? Myst�re ...


    Dommage ... je pr�f�rais la version que j'avais impl�ment� ... mais bon tant pis



    Merci pour tout

+ 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