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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Electricien
    Inscrit en
    Juillet 2013
    Messages
    74
    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 : 74
    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
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 089
    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
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre confirmé
    Homme Profil pro
    Electricien
    Inscrit en
    Juillet 2013
    Messages
    74
    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 : 74
    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 934
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 934
    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 confirmé
    Homme Profil pro
    Electricien
    Inscrit en
    Juillet 2013
    Messages
    74
    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 : 74
    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 confirmé
    Homme Profil pro
    Electricien
    Inscrit en
    Juillet 2013
    Messages
    74
    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 : 74
    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 934
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 934
    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;

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