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 :

Comment appeler des fonctions à partir d'un autre thread ?


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 Comment appeler des fonctions à partir d'un autre thread ?
    Hello,

    Une petite question se pose a moi.
    J'ai fait une application, multi-thread.
    Un thread sert a piloter une machine est dispose de plusieur fonction différente.

    Je voudrais pouvoir appelé ces fonctions à partir d un autre thread est je ne sais pas comment faire. J'ai entendu parler des messages et des evenemenent. Est ce que je suis sur la bonne voix ?

    Quelqu un aurait-il un exemple pour que je comprenne mieux ?

    Merci d avance.

  2. #2
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Salut
    Ca dépend de quelle sorte de messages tu veux parler...
    Tu pourrais expliquer plus précisement le fonctionnement?
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  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
    Alors plus précisement:
    On va dire que j ai 3 threads: A, B et C
    Dand le thread A je fait ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       ThreadB.procedure1
       ThreadC.procedure1
    Si je fais ça dans le thread A, il attend d avoir fini la procedure1 du thread B, avant de faire la procedure1 du thread C. Or moi je veux que la procedure1 ce déroule dans le contexte du thread, en gros le thread A lance les procédures mais n 'attends pas de retour.

    Le probleme c'est que je sais pas comment programmé ma procedure1 dans le thread B pour qu elle s'éxecute dans dans celui-ci.
    D'autant plus que le thread B contiient plusieur procedure que le thread A peu appelé.

    J'espere avoir été plus clair.

  4. #4
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Bon je pense comprendre... Je pense que tu peux, par exemple, au démarrage des threads B et C, faire une boucle qui attend qu'une variable soit true... Et une section critique qui change cette valeur dans B et C... Ensuite, pour démarrer B et C, A n'aura qu'à changer cette valeur...
    En revanche, tu es sur que cette structure est la solution idéale? Ce me parait un peu casse cou ton histoire (sans vouloir t'offenser )
    Il vaudrait peut-être mieux repenser l'architecture de ton programme pour faciliter le développement...
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  5. #5
    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
    Non non c est pas ça , mes threads sont deja démarrer.
    Je veux simplement pouvoir appeler les fonctions d'un thread a partir d un autre.

    Aprés quand a la façon dont j ai penser l application, je pense que je ne me suis pas tromper.... j y ai bien réfléchi.

  6. #6
    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
    J'ai trouév ce code sur le forum.
    Je me dis qu'il peu peut etre résoudre mon problème.

    Est ce que quelqu'un pourait me l expliquer plus en détail ?

    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    type 
      TClientEventWithStr = procedure(IdThread:Cardinal; Str:String) of object; 
      TClientEvent        = procedure(IdThread:Cardinal) of object; 
     
    type 
      TCustomClientThread = class(TThread) 
      private 
        { Déclarations privées } 
        fOnError, 
        fOnStateChange, 
        fOnDataSended, 
        fOnDataReceived   : TClientEventWithStr; 
        fOnConnected, 
        fOnDisconnected   : TClientEvent; 
        fClient           : TSocket; 
        PfClient          : PInteger; 
        fAdresse          : TClientAdresse; 
        fBuf              : PChar; 
        MsgStr            : String; 
        fSockAddrServeur  : TSockAddr; 
        procedure PrSendBuf; 
        procedure PrReceiveBuf; 
        procedure PrConnection; 
        procedure PrDeconnection; 
      protected 
        procedure Execute; override; 
      public 
        Constructor Create( Adresse : PClientAdresse; 
                            Client:TSocket); overload; 
        Constructor Create( Socket:TSocket); overload; 
        Destructor Destroy; override; 
      end; 
     
    Procedure TCustomClientThread.Execute; 
    var 
       Msg : TMsg ; 
       fpHandles: ^THandle; 
    begin 
         fpHandles:=nil; 
         While (Not Terminated) Do 
               Begin 
               MsgWaitForMultipleObjects(0,fpHandles,FALSE,500,QS_ALLINPUT); 
               While (Not Terminated) And (PeekMessage(Msg,HWND(-1),0,0,PM_REMOVE)) Do 
                     If Msg.message = CLIENT_THREAD Then 
                        Case Msg.wParam of 
                             CONNECTION   : PrConnection; 
                             DECONNECTION : PrDeconnection; 
                             RECEPTION    : PrReceiveBuf; 
                             ENVOIE       : Begin 
                                            fBuf:=AllocMem(Length(PChar(Msg.lParam))+1); 
                                            StrCopy(fBuf,PChar(Msg.lParam)); 
                                            PrSendBuf; 
                                            End; 
     
                            SET_PROC_ERROR        : @fOnError := Pointer(Msg.lParam); 
                            SET_PROC_STATE        : @fOnStateChange := Pointer(Msg.lParam); 
                            SET_PROC_DATASENDED   : @fOnDataSended := Pointer(Msg.lParam); 
                            SET_PROC_DATARECEIVED : @fOnDataReceived := Pointer(Msg.lParam); 
                            SET_PROC_CONNECTED    : @fOnConnected := Pointer(Msg.lParam); 
                            SET_PROC_DISCONNECTED : @fOnDisconnected := Pointer(Msg.lParam); 
                        End 
                     Else Begin 
                          TranslateMessage(Msg); 
                          DispatchMessage(Msg); 
                          End; 
               End; 
    End; 
     
    //Bon pour la fiche c'est plus laborieux 
    type 
      TForm1 = class(TForm) 
        Memo1: TMemo; 
        TestEvent: TButton; 
        procedure TestEvent(Sender: TObject); 
      private 
      public 
        procedure threadStr(IdThread:Cardinal; Str:String); 
      end; 
     
    procedure TForm1.threadStr(IdThread:Cardinal; Str:String); 
    begin//pour acceder au memo obligation de préciser Form1 
      Form1.memo1.Lines.Append(Str); 
    end; 
     
    procedure TForm1.TestEvent(Sender: TObject); 
    var addrProc:TClientEventWithStr; 
    begin//obligation de passer par une variable 
      addrProc:=threadStr; 
      PostThreadMessage(ThreadID,CLIENT_THREAD,SET_PROC_STATE,Integer(@addrProc)); 
    end;

  7. #7
    Membre habitué
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 151
    Points
    151
    Par défaut
    Bonsoir.
    Ceci devrait marcher.
    Bonne soirée.

    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
    64
    65
    66
    67
    68
    69
     
    // Definir les travaux....
    TThreadB_Job = ( jbProcedure1, jbProcedure2 );
    TThreadC_Job = ( jcProcedure1, jcProcedure2 );
     
    // Définir une liste de travaux avec verrous!!!!!!
    TJobList = Class
    Public
      Procedure BeginRead();
      Procedure EndRead();
      Procedure BeginWrite();
      Procedure EndWrite();
     
      function ExtractNextThreadB_Job() : TThreadB_Job;
      procedure AddThreadB_Job(AJob : TThreadB_Job);
      function ExtractNextThreadC_Job() : TThreadC_Job;
      procedure AddThreadC_Job(AJob : TThreadC_Job);
    End;
     
    Var JobList : TJobList; // Dans une unité partagée!!!
     
    Procedure TThreadB.Execute();
    Var
      theJob : TThreadB_Job;
    Begin
      While Not Terminate Do Begin
        JobList.BeginRead();
        Try
          //S'il ya du boulot
          If JobList.HasJobForThreadB() Then Begin
            JobList.BeginWrite();
            Try
              //extraire le prochain boulot...
              theJob := JobList.ExtractNextThreadB_Job();
            Finally
              JobList.EndWrite();
            End;
            //  et l'éxécuter
            Case theJob Of
              jbProcedure1 : Procedure1();
              jbProcedure2 : Procedure2();
            End;
          End Else Begin
            Suspend(); // S'il n'ya pas de boulot, alors SE REPOSER!!!!!!
          End;
        Finally
          JobList.EndRead();
        End;
      End;
    End;
     
    Procedure TThreadA.Execute();
    Begin
      JobList.BeginWrite();
      Try
        //Ajouter du boulot pour ThreadB, ca se bloque pas ThreadA !!!!!
        JobList.AddThreadB_Job(jbProcedure1);
        //Ajouter du boulot pour ThreadC, ca se bloque pas ThreadA !!!!!
        JobList.AddThreadC_Job(jcProcedure1);
      Finally
        JobList.EndWrite();
        // S'il dort, le reveiller
        If ThreadB.Suspended Then
          ThreadB.Resume();
        // S'il dort, le reveiller
        If ThreadC.Suspended Then
          ThreadC.Resume();
      End;
    End;

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/05/2007, 18h43
  2. Appel des fonctions à partir d'un module
    Par walf80 dans le forum VB 6 et antérieur
    Réponses: 42
    Dernier message: 21/03/2007, 12h56
  3. Comment appeler des fonctions C# sous Excel
    Par ttttnht dans le forum Windows Forms
    Réponses: 1
    Dernier message: 12/09/2006, 16h49

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