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

C Discussion :

Utilisation des dll et threads


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 64
    Par défaut Utilisation des dll et threads
    Bonjour,

    Je suis en train de développer une application en C sur un compilateur CVI. Mon application a pour but de communiquer avec des instruments de mesure par intermédiaire des ports série ou autres ports quelconques dans le futur. J'aimerais créer une dll de communication qui gère, avec un protocole défini apriori, la communication. Je voudrais pour ce faire, que la dll de communication ce dedouble (dans le sens figuré du terme) et que se lance dans un thread indépendant pour chaque appareil et pour chaque port com.
    Actuellement j'ai deja utilisé cette methode mais pour un seul appareil et un seul port com, et je voudrais savoir comment faire pour utiliser la même dll pour les autres port coms et independament?

    Merci d'avance pour vos commentaires.

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    L'application principale énumère les ports/equipements avec lesquels elle peut communiquer
    Pour chaque équipement,
    elle créé un "contexte" (structure ou classe allouée dynamiquement) qui permet de référence de manière unique et non ambigüe l'équipement/port de communication
    elle créé un thread et passe en paramètre à ce thread le contexte

    Chaque thread est responsable de la gestion de l'équipement spécifié par le contexte au lancement du thread
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut
    ce que ta di rqm_000 est vrai, et c'est une solution tres utiliser, mais le probleme c'est dans ton point de vue des chose, je m'explique, si tu veut que votre DLL soit independant de l'application qu'il utilise, et en meme temps sans obliger le programme a suivre une structure bien definie pour uriliser ta dll. je pense que tu peut lancer les thread a partir de ton DLL.

    Une methode simple, pour chaque application, le dll est charge avec des donnees specifiaue au application, donc, si tu a une variable qui represente le nombre d'appel du DLL tu peut cree le nombre de thread que tu souhaite, sans limitation pour le programmeur de l'application.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 64
    Par défaut
    Merci les gars pour vos réponses, c'est bien intéressant ce que vous me conseillez.
    Je vais essayer d'expliquer un peu plus les choses:
    Ma dll serait composé pour le moment d'une fonction appelé (bien sur j'omets pour l'instant les appels stdcall et les types des fonctions pour ce concentrer sur le fonctionnement):

    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
    void Command(int comport,int read_write,int N_codes,int *codes,int *data_length,int *data_in) 
    {
       copie des datas dans la structure comm
       allocation de mémoire
       acknowledge()
    }
     
    void acknowledge()
    {
       programmation d'une interruption sur le port com pour fin_acknowledge()
       Envoi des codes d'acknolewdge
    } 
     
    void fin_acknowledge()
    {
        lecture de réponse
        debut_com()
    }
     
    void debut_com()
    {
       libération mémoire data_in 
       programmation d'une interruption sur le port com pour fin_com()    
       envoi des codes et datas
    }
     
    void fin_com()
    {
       lecture des donnés
       raz des structures et buffers
       libération mémoire data_out
    }
    Alors sur cette architecture j'ai crée une structure de communication:
    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
    typedef struct
            {
                int comport;
                int read_write;
                int N_codes;
     
                int data_length[USER_MAX_CODES];
                SHORTINT codes[USER_MAX_CODES];
                SHORTINT N_bytes[USER_MAX_CODES];
                BYTE *data_in[USER_MAX_CODES];
                BYTE *data_out[USER_MAX_CODES];
     
                int flag_com_busy;
     
            } COMMUNICATION;
    et bien sur j'alloue dynamiquement data_in et out(parce que si j'ai 10 instrument cela peut devenir lourd au niveau mémoire).

    Alors je compte mettre ce petit module dans une dll et pour chaque instrument le lancer dans un thread, mais la ou je coince c'est savoir si j'appelle dans des threads differents en même temps la fonction command de la dll, comment cela va se débrouiller.

    Un autre soucis c'est de récupérer l'information au niveau de l'application (j'avais penser passer en argument l'adresse d'une fonction a exécuter lors de la fin de comm)

    Je voulais savoir ce que vous en pensiez de cette utilisation de l'allocation dynamique.

    Merci les gars

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut

    Citation Envoyé par ppfromero Voir le message
    Alors je compte mettre ce petit module dans une dll et pour chaque instrument le lancer dans un thread, mais la ou je coince c'est savoir si j'appelle dans des threads differents en même temps la fonction command de la dll, comment cela va se débrouiller.
    La vraie question est plutôt "est ce que la fonction command() est réentrante" c'est à dire, peut elle être appelée simultanément depuis plusieurs threads. Si cette fonction n'utilise pas de variables globales ni ne fait des appels à des fonctions qui utilisent des variables globales(c'est moins facile d'être catégorique pour ce point), ta fonction est réentrante. Sinon, elle n'est pas réentrante et il faut alors la protéger avec une section critique par exemple de manière à garantir qu'un seul thread à la fois pourra l'exécuter. Les autres attendront.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Attention, thread-safe n'est pas la même chose que réentrant.

    Une fonction peut être réentrante sans être thread-safe, et inversement.
    Et aussi, il faut bien définir à quoi s'applique la thread-safety d'une fonction, si elle peut s'appliquer à plusieurs données.
    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.

Discussions similaires

  1. utilisation des dll
    Par od.dev dans le forum Delphi
    Réponses: 12
    Dernier message: 15/01/2007, 11h19
  2. Pourquoi inclure des .lib pour utiliser des DLLs système?
    Par NicolasJolet dans le forum Windows
    Réponses: 4
    Dernier message: 08/08/2006, 14h59
  3. Executable utilisant des DLLs et des LIB
    Par beb30 dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/08/2006, 10h51
  4. creer et utiliser des DLL
    Par couturier dans le forum MFC
    Réponses: 26
    Dernier message: 24/08/2005, 09h16
  5. [C#] Comment utiliser des dll win 32 dans un projet .NET
    Par Mickey.jet dans le forum Delphi .NET
    Réponses: 2
    Dernier message: 31/05/2005, 13h45

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