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 :

Thread ou autre méthode ?


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 149
    Points : 69
    Points
    69
    Par défaut Thread ou autre méthode ?
    Bonjour,

    J'ai une application qui reçoit des données en permanence sur mon port série par l'évènemment OnRxchar. Pendant que je reçois, je dois afficher ces données dans leur MDIChild respective. (Chaque donnée a une entête ID qui me permet de retrouver sa fenêtre).

    Pour l'instant, je fais ça en direct. Dès que je reçois une donnée sur le port, je fais le traitement. Mais je me suis rendu compte que je perdais des valeurs quand le débit était important. (Quand je ne fais pas de traitement = juste afficher dans un RichEdit je ne perds rien).

    Que dois-je faire pour traiter ces données ? thread ou autre chose de plus simple ? merci de vos conseils.
    a+

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 665
    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 665
    Points : 25 459
    Points
    25 459
    Par défaut
    Le Thread serait une bonne solution mais j'ignore commet se comporte le composant TComPort en Thread, ... je ne le connais pas !
    Attention manipuler une fenêtre depuis un Thread, c'est casse-gueule, et le synchronize risquerait de te poser les mêmes problèmes de perte de buffer ...

    Alors avant de passer au thread, une solution, à chaque réception, tu stocke dans une TList (TStringList, TObjectList ou encore un Array of Byte comme tu préféres), les données que tu reçois, et dans le OnIdle tu appele ton traitement

    Ainsi tant que tu as du débit, tu le récupéré, OnIdle est appelé lorsque l'application n'a rien à faire d'autre que de l'appeler ... cela arrive bien assez souvent ... sinon, un Timer, qui consulte toutes les secondes la liste, cela revient au même ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TMainForm = class(TForm
    private
      FComPortBuffer: TStringList; // Instanciation dans AfterConstruction et BeforeDestruction)
    published
      procedure AppIdle(Sender: TObject; var Done: Boolean);
      procedure ManageIdleEvent(Sender: TObject; var Done: Boolean);
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TMainForm.ComPortMainRxChar(Sender: TObject; Count: Integer);
    Var
      Buffer: string;
    begin
      ComPortMain.ReadStr(Buffer, Count);
      FComPortBuffer.Add(Buffer);
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TMainForm.AppIdle(Sender: TObject; var Done: Boolean);
    var
      I: Integer;
      AddressMethod: TMethod; 
    begin
      // Petit mécansime pour gérer le Idle dans toutes les fenêtres sans passer par  TApplicationEvents)
      for I := 0 to Screen.FormCount - 1 do
      begin
        AddressMethod.Code := Screen.Forms[I].MethodAddress('ManageIdleEvent');
        AddressMethod.Data := Self;
        if Assigned(AddressMethod.Code) then
          TIdleEvent(AddressMethod)(Sender, Done);
      end;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TMainForm.ManageIdleEvent(Sender: TObject; var Done: Boolean);
    begin
      if FComPortBuffer.Count > 0 then
      begin
        Affiche(FComPortBuffer[0]);
        FComPortBuffer.Delete(0);
      end;
    end;
    Avec les Threads, on peut aller très loin dans les délires, et c'est bien fun
    Je faisais cela pour le TClientSocket \ TServerSocket pour le TCP\IP, je stockais les receptions dans une FIFO (TThreadList), j'analysais le contenu des messages dans un Thread, si le message était correct il passait dans une autre ThreadList, sinon, il était loggué en erreur (gestion des erreurs différentes selon l'application), et un second thread s'occupait des traitements DB, et ajoutait dans une 4eme ThreadList les message TCP\IP est expédié vers les différents destinataires dans un pool de Thread selon le nombre de client ..., cela ajoutait dans une autre ThreadList les interactions IHM (des ordres prédéfinis, le passage de paramètre avec synchronize réclamant de la bidouille), un Timer s'occupait à afficher les interactions IHM,

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 149
    Points : 69
    Points
    69
    Par défaut
    Excellent je viens de tester ça marche à merveille.

    Thanks a lot man !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/03/2008, 09h38
  2. pb d'un Thread dans la méthode init() d'une Servle
    Par don'de dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 09/01/2007, 17h50
  3. bot IRC: posix threads et autres remarques
    Par keikoz dans le forum Réseau
    Réponses: 6
    Dernier message: 19/11/2006, 00h52
  4. Réponses: 7
    Dernier message: 06/05/2006, 15h06
  5. segment memoire partagee, thread, ou autre?
    Par Pouic dans le forum POSIX
    Réponses: 9
    Dernier message: 26/10/2004, 18h54

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