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 et multithreading ?


Sujet :

Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 159
    Points : 37
    Points
    37
    Par défaut thread et multithreading ?
    bonjour tout le monde

    j'ai du mal avec les thread j'ai besoin d'aide
    dans mon application j'ai une action qui ce résume on 3 procedure au démarrage 1er qui déclenche le Callback (Start) la 2eme et le Callback lui même 3eme et (StopCallback) qui arrête le Calback on fermant l'application

    le problème est que je doit lancé la même procedure 2 autre fois avec 2 paramètre différent ,sans arrêté la procedure on cour

    j'ai cherché un peut partout ça me renvoi toujours ver le thread et multithreadin

    comment maitre ces procédures dans un thread d'une manier que je peut les lancé au moins 3 fois au même temp ,moi j'essaye mais je n y arrive pas

    la procedure se résumé dans Start Callback et Stop

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure StartFilteringePMT(APAT_PID:Word=0);cdecl;
    begin
     
    StartFilter.DLL_ID := _MultiDec_DLL_ID;
    StartFilter.Filter_ID:=1;
    startFilter.Name:='PMT-Filter' ;
    StartFilter.Pid:=APAT_PID;
    StartFilter.Irq_Call_Adresse:=@MDAPI_CallbackPMT;
    SendMessage(_MultiDecWindow,WM_USER,MDAPI_START_FILTER,(LongWord(@StartFilter)));
    PAT_filter_running:=true;
     
    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
    15
    16
    17
    18
    19
    20
    21
    22
    procedure MDAPI_CallbackPMT( MyFilter : integer; DatenLaenge :integer;  Daten:PByteArray);cdecl;
    var i:integer;
    begin
    APMTtemp:='';
      for i:=0 to 183 do
                     begin
                     APMT:=APMT+inttohex(Daten[i],2);
                     if (i>8) and (copy(APMT,length(APMT)-8,8)='FFFFFFFF') then
                     begin
                     StopFiltering;
     
                    APMTtemp:=copy(APMT,1,length(APMT)-10);
                    APMT:=APMTtemp;
                    GUI.PushMSG_Info('PMT'+APMT);
     
     
                     PMTlist;
                     break;
                     end;
                     end;
     
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure StopFiltering;cdecl;
    begin
    SendMessage(_MultiDecWindow,WM_USER,MDAPI_STOP_FILTER,StartFilter.Running_ID);
    m_filter_running:=false;
    end;

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 812
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 812
    Points : 13 527
    Points
    13 527
    Par défaut
    Avoir un callback dans un thread nécessite une synchronisation, une boucle de message ne sortant qu'à la réception d'un WM_QUIT (envoyé par le callback).
    StartFilter.Filter_ID contient l'ID du thread.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    type
      TFilterThread = class(TThread)
      private
        Wnd      :hWnd;
        APAT_PID :THandle;
      protected
        procedure Execute; override;
      public
        constructor Create(aWnd :hWnd; aAPAT_PID :THandle);
      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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    { TFilterThread }
     
    constructor TFilterThread.Create(aWnd :hWnd; aAPAT_PID: THandle);
    begin
      inherited Create;
     
      Wnd             := aWnd;
      APAT_PID        := aAPAT_PID;
      FreeOnTerminate := TRUE;
    end;
     
    procedure TFilterThread.Execute;
    var
      Msg :TMsg;
     
      //- Callback ------------------------------------------------------------------------------------
      procedure MDAPI_CallbackPMT(MyFilter: integer; DatenLaenge: integer; Daten: PByteArray); cdecl;
      var
        i: integer;
      begin
        APMTtemp := '';
     
        for i := 0 to 183 do
        begin
          APMT := APMT + inttohex(Daten[i], 2);
          if (i > 8) and (copy(APMT, length(APMT) - 8, 8) = 'FFFFFFFF') then
          begin
            //StopFiltering - Synchro
            PostThreadMessage(MyFilter, WM_QUIT, 0, 0);  //En supposant que MyFilter corresponde à StartFilter.Filter_ID (à contrôler)
     
            APMTtemp := copy(APMT, 1, length(APMT) - 10);
            APMT := APMTtemp;
            GUI.PushMSG_Info('PMT' + APMT);
     
            PMTlist;
            break;
          end;
        end;
      end;
      //-----------------------------------------------------------------------------------------------
     
    begin
      //StartFilteringePMT
      StartFilter.DLL_ID           := _MultiDec_DLL_ID;
      StartFilter.Filter_ID        := ThreadID;          // Utilisé par PostThreadMessage dans callback
      StartFilter.Name             := 'PMT-Filter';
      StartFilter.Pid              := APAT_PID;
      StartFilter.Irq_Call_Adresse := @MDAPI_CallbackPMT;
     
      SendMessage(Wnd, WM_USER, MDAPI_START_FILTER, (LongWord(@StartFilter)));
      PAT_filter_running := TRUE;
     
      //Attente de WM_QUIT - Synchro
      while GetMessage(Msg, 0, 0, 0) do
      begin
        TranslateMessage(Msg);
        DispatchMessage(Msg);
      end;
     
      //StopFiltering
      SendMessage(Wnd, WM_USER, MDAPI_STOP_FILTER, StartFilter.Running_ID);
      m_filter_running := FALSE;
    end;
    Attention, il n'est pas possible d'appeler des propriétés/méthodes du thread depuis MDAPI_CallbackPMT !

    Et l'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TFilterThread.Create(_MultiDecWindow, PID1);
    TFilterThread.Create(_MultiDecWindow, PID2);
    TFilterThread.Create(_MultiDecWindow, PID3);
    ...
    Je n'ai bien entendu rien testé

  3. #3
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    il faudrait déjà vérifier que le traitement est threadsafe sinon il ne sera pas possible de le lancer en parallèle.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 159
    Points : 37
    Points
    37
    Par défaut
    Merci de votre aide

    je viens de testé le code la première erreur et sur

    il me dit pas assez de paramètre alors j'ai ajouté le false

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     inherited Create(false);
    après j'ai pas d'erreurs

    j'ai testé avec 2 thread et 2 paramètre différent
    j'ai le résultat du 2eme le 1er non

    séparément les 2 donne du résultât mais on même temps y a que le 2eme qui marche

    je voulez savoir aussi une fois lancé comment l’arrêté

Discussions similaires

  1. Proxy thread queue multithread probleme performance
    Par G4uthier dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 16/08/2011, 10h12
  2. [Thread]MultiThreading
    Par tuxman dans le forum Concurrence et multi-thread
    Réponses: 7
    Dernier message: 23/04/2008, 23h44
  3. [Req]Tuto Thread/Multithread et Tuto Sockets
    Par Booster2ooo dans le forum Delphi
    Réponses: 8
    Dernier message: 03/04/2007, 11h27
  4. Pb Linker (Single-threaded / Multithreaded)
    Par olive_le_malin dans le forum MFC
    Réponses: 4
    Dernier message: 26/08/2004, 17h30

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