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 : 91
    Points
    91
    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 382
    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 382
    Points : 41 590
    Points
    41 590
    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.

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 590
    Points
    41 590
    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.

  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 : 91
    Points
    91
    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 382
    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 382
    Points : 41 590
    Points
    41 590
    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.

  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 : 91
    Points
    91
    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, 08h41
  2. [VStudio 6] pb avec fonctions dans une DLL
    Par MogDeChNord dans le forum MFC
    Réponses: 8
    Dernier message: 08/01/2004, 09h57
  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, 22h36
  4. PB avec "self" dans une dll
    Par DiJiRiDouS dans le forum Langage
    Réponses: 2
    Dernier message: 21/02/2003, 10h32
  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, 11h15

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