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 :

[thread]Communication form <-> thread


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Nicodemus
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 242
    Par défaut [thread]Communication form <-> thread
    Bonjour,

    Voici mon problème :
    Dans un thread je crée une form. Celle-ci possède différents boutons, paramètres etc qui peuvent être modifiés en cours d'execution. Cependant dans le thread, je n'arrive pas à savoir quand un évenement est déclenché dans la form (buttonclik etc...).

    Y a-t-il un moyen de connaitre dans le thread qui crée la form, les événements qui ont lieu dans cette form ?

    Merci pour vos réponses.

  2. #2
    Membre chevronné
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Par défaut
    bonjour,
    Tu créé donc une form dynamiquement avec des boutons, peux tu nous copier ici la création de cette form et de ses boutons (la form et 1 bouton suffiront si le code est trop long)

    Pense notamment à vérifier si tu as bien branché les évenements :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Button1.onClick := MaProcedureClick;
    bon courage !

  3. #3
    Membre confirmé Avatar de Nicodemus
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 242
    Par défaut
    Voici une partie du code pour le thread :

    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
    type
      ThreadClient = class(TThread)
      private
     
        frameCam : TFCamClient;
        showFrame : boolean;
     
        procedure OnTerminateProcedure(Sender : TObject);
        { Private declarations }
      protected
        procedure Execute; override;
     
      public
        constructor Create();
        procedure displayVideoFrame(show : boolean);
        procedure setConfig();
      end;
     
    implementation
     
    { ThreadClient }
     
     
    constructor ThreadClient.Create();
    begin
     
    FreeOnTerminate := True; // Libére la mémoire lorsque le thread est termisé
    inherited Create(False); // Création du processus
     
    { Ajout caméra }
    displayVideoFrame(true);
     
    end;
     
    procedure ThreadClient.displayVideoFrame(show : boolean);
    begin
    { Affichage d'une caméra }
     
    if show then
      frameCam := TFCamClient.Create(Application);
     
    end;
    Le code de la frame créée dans le thread :
    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
    type
      TFCamClient = class(TForm)
        Panel1: TPanel;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        Button4: TButton;
        ActionList1: TActionList;
        setConfig: TAction;
     
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure FormCreate(Sender: TObject);
        procedure setConfigExecute(Sender: TObject);
      private
        configCam : TFCamConfig;
        { Private declarations }
      public
        { Public declarations }
      end;
     
    implementation
     
    {$R *.dfm}
     
     
    procedure TFCamClient.setConfigExecute(Sender: TObject);
    begin
     
    configCam := TFCamConfig.Create(Self);
    configCam.Hide;
    configCam.ShowModal;
     
    ShowMessage(configCam.strbuttonPress);
    end;

    Je n'ai montré dans le code que les procédures qui nous intéressent ici. La form configCam crée juste au dessus est simplement composée de plusieurs edit qui permettent de changer des paramètres.

    Je voudrais donc savoir dans le thread quand est-ce que l'utilisateur a cliqué sur le bouton qui lance la procédure TFCamClient.setConfigExecute et qui donc crée la form configCam afin de connaitre les paramètres modifiés dans celle-ci

    Je ne sais pas si je suis clair, c'est pas évident à formuler

  4. #4
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    La form doit notifier le thread chaque fois qu'il y'a eu un evènement : tu peux utiliser les messages, ou tu peux coder une fonction dans la thread qui répond à un evènement passé en paramètre, et cette fonction doit être appelé par la form chaque fois qu'il le faut ! oh la la ! je pense que je parle en chinois, j'explique :

    dans le thread, tu ajoutes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure Thread1.respond( evt : byte);
    begin
     case evt of
      0 : // bla bla bla
      1 : // blo blo blo..
     end;
    end;
    et pour ta form, si l'utilisateur clique sur le bouton 1 par exemple, tu appèles la méthode respond avec le paramètre correct !

    J'espère que c'était clair.

  5. #5
    DMO
    DMO est déconnecté
    Membre chevronné
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Par défaut
    Dis-moi si je me trompe :
    Nous sommes en cours d'execution et :

    un ou plusieurs TThreadClient (t'as oublié le T) tournent.
    L'utilisateur modifie la configuration.
    Lorsqu'il valide, tu souhaites que le ou les TThreadClient en cours d'execution prennent en compte la nouvelle configuration, puis continuent leur exécution.

    Si je n'ai pas compris, laisse tomber et ne tiens pas compte des conseils suivants, sinon :

    L'application va lire et écrire la configuration.
    Les threads vont lire aussi la configuration.

    Donc :

    L'objet représentant la configuration (en principe il ne faut pas accéder directement aux TEdit, etc...) doit être protégé par un TMultiReadExclusiveWriteSynchronizer (ou un criticalsection mais c'est moins pratique)
    Il peut y avoir par exemple dans le TThreadClient une propriété de type boolean, disons ConfigChanged, protégée elle aussi par TMultiReadExclusiveWriteSynchronizer, que le thread va tester à chaque itération du Execute et le cas échéant appliquer la nouvelle configuration.

    Rien de figé dans tout cela, c'est juste pour attirer ton attention sur le fait qu'il ne faut pas négliger la synchronisation des threads, sous peine d'avoir par exemple des Access Violation intempestives...

    Bon courage.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Par défaut
    La VCL n'est pas thread safe!

    Il ne faut pas manipuler la VCL dans des threads autre que le thread principal.

    Si tu veux agir sur ton interface au sein d'un thread autre que le thread principal, tu peux utiliser la fonction Synchronize.

    Pour plus de détail, F1 sur la fonction Synchronize

Discussions similaires

  1. [Multi-threading] Communication d'enregistrements entre threads
    Par Bleys dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 04/07/2008, 12h36
  2. [VB.Net][Threading] Communication entre processus
    Par DonF dans le forum Windows Forms
    Réponses: 2
    Dernier message: 21/02/2006, 15h15
  3. Creation dune Form ds un Thread
    Par Soulama dans le forum Langage
    Réponses: 1
    Dernier message: 17/01/2006, 12h41
  4. [c#][threading] communication entre threads
    Par orelero dans le forum C#
    Réponses: 6
    Dernier message: 02/01/2006, 00h42
  5. Assigner une forme a un thread
    Par riou93 dans le forum Langage
    Réponses: 5
    Dernier message: 08/08/2005, 11h32

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