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 :

Aide pour Timer dans Dll


Sujet :

Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Electricien
    Inscrit en
    Juillet 2013
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Electricien
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2013
    Messages : 69
    Points : 52
    Points
    52
    Par défaut Aide pour Timer dans Dll
    Bonjour à tous,

    voilà je bloque depuis un moment sur la création d'un timer dans une Dll . Je cherche à utiliser un timer dans une dll mais qui est chargée par un autre process dont je ne maîtrise pas le code. Le seul lien que j'ai entre ma dll et mon programme ce fait via memory mapped file
    Pouvez vous me donner un coup de pouce

    cordialement

    Oscar02

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 676
    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 676
    Points : 25 491
    Points
    25 491
    Par défaut
    Pourtant le TTimer crée sa propre fenêtre avec un AllocateHWnd ?
    Je me demande si le thread de la DLL doit faire un PeekMessage/DispatchMessage et cela me semble difficile faire une boucle de message dans une DLL hormis dans un TThread

    Je serais toi, je ferais un TThread, avec comme temps d'attente du TEvent, le temps du timer
    Tu auras un comportement similaire à un TTimer
    En tout cas, c'est comme cela que je le faisais

  3. #3
    Membre du Club
    Homme Profil pro
    Electricien
    Inscrit en
    Juillet 2013
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Electricien
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2013
    Messages : 69
    Points : 52
    Points
    52
    Par défaut
    Je suis ouvert à ta proposition, mais j'ai tester différent code de thread sur le net et je n'arrive pas à le faire fonctionner , je te donne plus de détails tous à l'heure

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 815
    Points : 13 531
    Points
    13 531
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Je me demande si le thread de la DLL doit faire un PeekMessage/DispatchMessage et cela me semble difficile faire une boucle de message dans une DLL hormis dans un TThread
    Oui, il faudrait obligatoirement une boucle de messages dans le thread mais TTimer n'est pas thread-safe. A éviter !
    +1 pour l'Event.

  5. #5
    Membre du Club
    Homme Profil pro
    Electricien
    Inscrit en
    Juillet 2013
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Electricien
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2013
    Messages : 69
    Points : 52
    Points
    52
    Par défaut
    Bonsoir à tous,

    voilà je vous donne plus de détails .

    Je code une dll qui a différentes fonctions , et qui est charger par un process qui n'est pas codé par moi. Mais ce n'est pas un soucis elle ce charge correctement. Dans cette dll j'y est inclus un memory mapped file pour communiquer entre ma dll et mon programme.
    Ce que je souhaite faire, c'est avoir dans cette dll un thread ou timer qui puisse être à l'écoute de ma variable de mon mapped file. Si variable est à 1 alors mon timer ou thread appel une function de ma dll sinon rien. Cette fonction n'agis pas sur mon programme qui envoi la variable 1, mais sur l'autre process.

    Voilà j'espère avoir expliquer correctement

    Merci encore de votre aide

    Oscar02

  6. #6
    Membre du Club
    Homme Profil pro
    Electricien
    Inscrit en
    Juillet 2013
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Electricien
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2013
    Messages : 69
    Points : 52
    Points
    52
    Par défaut
    Salut à tous

    Avez vous eu le temps de réfléchir à ma demande ?

    Cordialement

    Oscar02

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 815
    Points : 13 531
    Points
    13 531
    Par défaut
    Dire "ça ne marche pas" n'est jamais très constructif ! Où est-ce que ça coince ?

    Le thread doit être démarré depuis DLL_PROCESS_ATTACH et libéré depuis DLL_PROCESS_DETACH.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    library MaDLL;
     
    procedure DllEntryPoint(dwReason :dword);
    begin
      case dwReason of
        Dll_Process_Attach : Thread := TMonThread.Create;
        Dll_Process_Detach : Thread.Free;
      end;
    end;
     
    begin
      DLLProc := @DllEntryPoint;
      DLLEntryPoint(Dll_Process_Attach);
    end.
    Le fichier mappé est-il vraiment la meilleure solution ? Y a-t-il partage de données ? S'il ne contient qu'un flag de synchro, il est parfaitement inutile. Le thread en attente d'un Event activé par ton programme est suffisant. Je rappelle qu'un Event est partagé par tous les processus d'une même session, voire tous les processus du système si son nom est préfixé par Global\.

    Exe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure DllStart;
    begin
      StartEvent.SetEvent;
    end;
    DLL :
    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 TMonThread.Execute;
    begin
      while not Terminated do
      begin
        //Attente
        if StartEvent.WaitFor(1000) = wrSignaled then
        begin
          StartEvent.ResetEvent;
     
          //Traitement
          ...
        end;
      end;
    end;
    S'il y a effectivement partage de données, il faudrait deux Events : un de démarrage pour faire sortir la DLL du mode attente et un de fin pour avertir le programme que l'exécution est terminée, qu'il peut écrire de nouvelles données.

    Exe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure DllStart;
    begin
      //Attend que la DLL ait terminé l'action précédente
      WaitEvent.WaitFor(INFINITE);
     
      //Nouvelles données
      ...
     
      //Redémarre
      WaitEvent.ResetEvent;
      StartEvent.SetEvent;
    end;
    DLL :
    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
    //Thread
    procedure TMonThread.Execute;
    begin
      while not Terminated do
      begin
        //Attente
        if StartEvent.WaitFor(1000) = wrSignaled then
        begin
          //Traitement
          ...
     
          //Prêt
          StartEvent.ResetEvent;
          WaitEvent.SetEvent;
        end;
      end;
    end;

  8. #8
    Membre du Club
    Homme Profil pro
    Electricien
    Inscrit en
    Juillet 2013
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Electricien
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2013
    Messages : 69
    Points : 52
    Points
    52
    Par défaut
    Merci pour toute ces explications. Je vais faire des essais selon tes conseils et je vous tiens au courant

    Cordialement

    Oscar02

Discussions similaires

  1. Aide pour utiliser une DLL C++ dans D7
    Par ESQUIRO dans le forum Langage
    Réponses: 1
    Dernier message: 15/02/2012, 01h28
  2. aide pour timer.task
    Par Ashkell dans le forum Général Java
    Réponses: 1
    Dernier message: 24/01/2008, 15h10
  3. aide pour lecture dans un fichier
    Par hichamo dans le forum C
    Réponses: 9
    Dernier message: 01/05/2007, 10h46
  4. Besoin d'aide pour lire dans le registre
    Par Pierre.g dans le forum Windows
    Réponses: 6
    Dernier message: 16/08/2006, 22h37

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