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

Windows Discussion :

FIFO dans une dll


Sujet :

Windows

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 200
    Points : 89
    Points
    89
    Par défaut FIFO dans une dll
    Bonjour,
    Est-il possible d'avoir une FIFO dans une dll avec le push et le pop appelés par deux autres dll ?

    Merci

    Nicolas
    Strasbourg

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Bonjour,
    Ça dépend de problèmes d'allocation.
    (Note: Une FIFO n'a pas de push()/pop(), c'est pour du LIFO ça. En FIFO, on utilise plutôt enqueue()/dequeue(), ou post()/get(), etc.)

    Si ta FIFO ne fait aucune allocation sur les objets eux-mêmes (genre, tu lui passes juste un pointeur et tu rècupères un pointeur, la FIFO ne détruit jamais elle-même un objet), alors cette FIFO peut être dans une DLL indépendante sans problème aucun.

    Par contre, une fois la première question réglée, il peut y avoir un problème au niveau des utilisateurs: S'il y a une DLL qui produit et l'autre qui consume, la DLL consommatrice ne devra pas désallouer elle-même : Elle devra appeler une fonction de la DLL productrice (pourquoi pas via une interface, pour éviter une dépendance) pour détruire les objets.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Exemple:
    Code DLL FIFO: : 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
    static void FIFO_Enqueue(void *pData)
    {
    //L'implémentation peut utiliser n'importe quoi ici : Liste, malloc(), new...
    //Mais on ne tente pas de copier les données:
    //On ne manipule que le pointeur, et on le stocke en tant que pointeur.
    }
    
    static void * FIFO_Dequeue()
    {
    //L'implémentation peut utiliser n'importe quoi ici : Liste, free(), delete...
    //Mais on ne tente pas de copier les données:
    //On ne manipule que le pointeur, et on le stocke en tant que pointeur.
    }
    
    void FifoEnqueueObject(FifoObject *pObj)
    {
    //On ne touche pas à l'objet lui-même: 
    //Aucune allocation, désallocation ou opération de copie: 
    //On ne manipule que le pointeur, et on le stocke en tant que pointeur.
    FIFO_Enqueue(pObj);
    }
    
    void FifoDequeueObject()
    {
    //On ne touche pas à l'objet lui-même: 
    //Aucune allocation, désallocation ou opération de copie: 
    //On ne manipule que le pointeur, et on le stocke en tant que pointeur.
    return static_cast<FifoObject * >(FIFO_dequeue());
    }
    Code DLL Productrice : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void Produce()
    {
    FifoEnqueueObject(new FifoObject);
    }
    
    void Destroy(FifoObject *pObj)
    {
    delete pObj;
    }
    Code DLL Consommatrice : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void Consume(void (*destroyProc)(FifoObject*))
    {
    FifoObject * pObj = FifoDequeueObject();
    //On ne détruit pas l'objet soi-même : On appelle la fonction.
    destroyProc(pObj);
    }


    Dans cet exemple,
    • les allocations et désallocations internes de la FIFO elle-même sont faites par la DLL de la FIFO;
    • les allocations et désallocations d'objets sont faites par la DLL productrice.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 200
    Points : 89
    Points
    89
    Par défaut
    Erreur d'expression entre pile et queue pour le pop/push...

    Sinon, je pensais faire l'allocation dans la dll "queue". Les 2 autres dll sont exécutés dans le même process (2 thread différents).


  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    J'ignore si tu as pu lire tout mon dernier post (j'ai édité depuis).

    Dans mon exemple, les allocations internes à la liste et les allocations externes à la liste sont convenablement séparées.

    PS: Je viens de voir que la STL avait fait la même erreur pour les queues, en appelant ses méthodes push() et pop(), ô hérésie.
    PPS: Tiens, post()/get(), le tutoriel, lui, donne des noms raisonnables.

    Quoi qu'il en soit, cette structure de queue ne fait que des allocations internes, elle est donc appropriée pour mon exemple.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 200
    Points : 89
    Points
    89
    Par défaut
    Si j'ai bien compris, la queue ne fait de la manipulation de pointeurs.
    On a aucune copie de données.

    Comme la mémoire est partagée (même processus), le consommateur sait où chercher l'information (chez le producteur).

    Merci beaucoup Médinoc pour ta réactivité.

    Nicolas
    strasbourg

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

Discussions similaires

  1. [MDI][DLL] Enfant MDI dans une dll
    Par Pascal Jankowski dans le forum Composants VCL
    Réponses: 5
    Dernier message: 02/04/2004, 07h41
  2. [VStudio 6] pb avec fonctions dans une DLL
    Par MogDeChNord dans le forum MFC
    Réponses: 8
    Dernier message: 08/01/2004, 08h57
  3. [BP7] Problème chargement de ressource dans une DLL
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 11
    Dernier message: 26/07/2003, 21h36
  4. PB avec "self" dans une dll
    Par DiJiRiDouS dans le forum Langage
    Réponses: 2
    Dernier message: 21/02/2003, 09h32
  5. [VB6]Passage d'un tableau dans une DLL écrite en delphi
    Par flash dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 20/09/2002, 10h15

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