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 Forms Discussion :

[C#] DLL multithread


Sujet :

Windows Forms

  1. #21
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 144
    Par défaut
    Citation Envoyé par Kaidan Voir le message
    Par défaut, le ThreadPool gère effectivement 25 threads par processeur d'où l'interêt de QueueUserWorkItem : 25 requêtes par processeur seront traitées directement par un thread du pool et les suivantes seront mise dans la liste d'attente jusqu'à ce qu'un thread se libère.

    L'automate, c'est une fonction du programme ou un programme à part ?
    Comment le programme qui reçoit les requêtes communique avec l'automate ?
    Je pense que je vais utiliser les 2, QueueUserWorkItem et une Queue.
    L'automate est un automate programmable industriel avec lequel la DLL va communiquer en utilisant un port série.

    Penses-tu qu'il faut un thread supplémentaire pour déclencher les threads du pool, ou la fonction déclenchée lors de l'appel de la DLL peut-elle se charger de déclencher les threads du threadpool ?

  2. #22
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    Si l'hôte de la DLL ne fait QUE réceptionner les requêtes et les mettre dans le ThreadPool pour ajout dans la queue de requêtes, autant utiliser le thread de l'application. Si il fait d'autres choses (gérer Start / Stop), interagir avec la Console etc. mieux vaut utiliser un autre thread.

  3. #23
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 144
    Par défaut
    Citation Envoyé par Kaidan Voir le message
    Si l'hôte de la DLL ne fait QUE réceptionner les requêtes et les mettre dans le ThreadPool pour ajout dans la queue de requêtes, autant utiliser le thread de l'application. Si il fait d'autres choses (gérer Start / Stop), interagir avec la Console etc. mieux vaut utiliser un autre thread.
    Le Thread chargé de prendre les requêtes dans la Queue et les envoyer à l'automate fonctionnera en permanence, donc je pense que ce sera le thread de l'application.
    Le thread réceptionnant les requêtes et les placant dans la queue ne ferait que ca, s'il en faut un.
    Qu'en penses-tu ?

  4. #24
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    A mon avis, le mieux est de conserver le thread principal pour pouvoir le killer au besoin et envoyer un message à tous les autres threads pour dire "on arrête d'écouter, on envoie tout et on ferme" histoire de quitter proprement. Lors de l'intialisation du programme, tu peux créer le thread qui se charge d'accepter les requêtes entrantes et le thread qui se charge de poller la queue de d'envoyer à l'automate.

  5. #25
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 144
    Par défaut
    Citation Envoyé par Kaidan Voir le message
    A mon avis, le mieux est de conserver le thread principal pour pouvoir le killer au besoin et envoyer un message à tous les autres threads pour dire "on arrête d'écouter, on envoie tout et on ferme" histoire de quitter proprement. Lors de l'intialisation du programme, tu peux créer le thread qui se charge d'accepter les requêtes entrantes et le thread qui se charge de poller la queue de d'envoyer à l'automate.
    Je pense que tu as raison. Le thread principal crée tous les autres threads et les termine lorsqu'il faut arrêter tout.
    Je vais essayer comme ca.

  6. #26
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 144
    Par défaut
    Bonjour,
    J'ai une question au sujet de ma DLL.
    Cette DLL contient un fichier program.cs, ce fichier contient une fonction Main. Quelqu'un sait-il quand cette fonction Main sera exécutée ? est-ce lors du premier appel d'une fonction de la DLL ?
    A quel thread appartient cette fonction Main ? à un thread propre à la DLL ?
    Autre question : cette DLL contient une fonction PORT1_DataReceived qui est déclenchée sur l'événement DataReceived d'un port COM. A quel thread appartient cette fonction ?
    Merci d'avance pour vos réponses.

  7. #27
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Citation Envoyé par levalp Voir le message
    Bonjour,
    J'ai une question au sujet de ma DLL.
    Cette DLL contient un fichier program.cs, ce fichier contient une fonction Main. Quelqu'un sait-il quand cette fonction Main sera exécutée ? est-ce lors du premier appel d'une fonction de la DLL ?
    A quel thread appartient cette fonction Main ? à un thread propre à la DLL ?
    Autre question : cette DLL contient une fonction PORT1_DataReceived qui est déclenchée sur l'événement DataReceived d'un port COM. A quel thread appartient cette fonction ?
    Merci d'avance pour vos réponses.
    Salut Levalp,

    le main d'une DLL (un assembly compilé comme bibliotheque de classe j'entends) n'est jamais executé implicitement, une DLL ne demarre pas, et n'est pas executé, c'est un recueil de classe, point.

    Si tu parles de ce DataReceived, c'est indiqué que le callback sera traité par un thread du pool (comprendre un thread quelconque).

  8. #28
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 144
    Par défaut
    Citation Envoyé par SirJulio Voir le message
    Salut Levalp,

    le main d'une DLL (un assembly compilé comme bibliotheque de classe j'entends) n'est jamais executé implicitement, une DLL ne demarre pas, et n'est pas executé, c'est un recueil de classe, point.

    Si tu parles de ce DataReceived, c'est indiqué que le callback sera traité par un thread du pool (comprendre un thread quelconque).
    Salut,
    Je ne comprends pas bien, car le Main de ma DLL va lancer un thread, donc ce code doit bien être exécuté quelque part ?

    Concernant le DataReceived, je lis : "L'événement DataReceived est déclenché sur un thread secondaire lorsque des données sont reçues de l'objet SerialPort. Cet événement étant déclenché sur un thread secondaire et non sur le thread principal,..."
    mais vu que pour moi c'est dans une DLL, dois-je comprendre qu'il s'agit dans mon cas du thread principal du programme appelant la DLL ?
    merci d'avance

  9. #29
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par levalp Voir le message
    Salut,
    Je ne comprends pas bien, car le Main de ma DLL va lancer un thread, donc ce code doit bien être exécuté quelque part ?
    Une DLL en .Net n'a pas à avoir de Main.

  10. #30
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Comme l'ont indiqué SirJulio et BlueDeep, et je me permet d'insister parce que tu fais plusieurs fois la confusion dans cetet discussion, une DLL n'est qu'un ensemble de classes mises ensemble dans un même fichier ; ça n'a aucun rapport avec le concepts de thread, événement, AppDomain, etc. Ton problème (gestion de threads, Threadpool, etc.) serait strictement le même si ton code était entièrement compris dans une même assembly.

  11. #31
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Salut Levalp,

    pour etre plus explicite, vu qu'une DLL ne peut, structurellement, pas etre demarré (executé), c'est forcement un exe (console, windows whatever) qui va l'appeler. De fait, la problematique de threading est reporté vers cette assembly tierce (qui appelle, et comment ?). Simplifions le cas à l'"extreme :

    -j'ai un exe console qui appelle des methodes de ma DLL.
    -une DLL avec des methodes

    si j'appelle ma methode de ma DLL en la threadant depuis mon appli alors l'appel se fera sur un thread tiers (poolé ou non). A contrario, si j'appelle ma methode directement, l'appel se fera sur le thread ayant demarré mon appli (qu'on pourrait appeler le thread principal).

    Que ta DLL contienne ou non un main ne change pas le probleme (une dll peut avoir un main ce n'est pas interdit juste inutile), un assembly compilé en /out:Library (donc ce qu'on appelle une DLL) ne peut pas etre demarré, il sera juste parcouru par les autres assemblies faisant des appels dessus.

    Pour le Datareceived, je ne sais pas trop comment ca marche, mais j'imagine que tu dois initialiser la classe et la classe emet des events (datareceived ici) quand elle entends quelque chose. Les callbacks de ces events seront executés par un thread du pool (au meme titre qu'un timer si tu veux, tu init un timer les callback d'elapsed sont levés par un thread tiers).

    Bref, dans une DLL, si cette derniere ne créé pas explicitement de thread (new thread blabla) ou implicitement (le datareceived par exemple, mais aussi des methodes async quelconque), la problematique du thread est reporté vers l'appelant.

    En esperant avoir ete plus clair. =)

  12. #32
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 144
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Une DLL en .Net n'a pas à avoir de Main.
    Citation Envoyé par Guulh Voir le message
    Comme l'ont indiqué SirJulio et BlueDeep, et je me permet d'insister parce que tu fais plusieurs fois la confusion dans cetet discussion, une DLL n'est qu'un ensemble de classes mises ensemble dans un même fichier ; ça n'a aucun rapport avec le concepts de thread, événement, AppDomain, etc. Ton problème (gestion de threads, Threadpool, etc.) serait strictement le même si ton code était entièrement compris dans une même assembly.
    Bonjour Bluedeep et Guulh,
    Merci pour ces précisions. je crois que maintenant j'ai compris comment ca fonctionne.

  13. #33
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 144
    Par défaut
    Citation Envoyé par SirJulio Voir le message
    Salut Levalp,

    pour etre plus explicite, vu qu'une DLL ne peut, structurellement, pas etre demarré (executé), c'est forcement un exe (console, windows whatever) qui va l'appeler. De fait, la problematique de threading est reporté vers cette assembly tierce (qui appelle, et comment ?). Simplifions le cas à l'"extreme :

    -j'ai un exe console qui appelle des methodes de ma DLL.
    -une DLL avec des methodes

    si j'appelle ma methode de ma DLL en la threadant depuis mon appli alors l'appel se fera sur un thread tiers (poolé ou non). A contrario, si j'appelle ma methode directement, l'appel se fera sur le thread ayant demarré mon appli (qu'on pourrait appeler le thread principal).

    Que ta DLL contienne ou non un main ne change pas le probleme (une dll peut avoir un main ce n'est pas interdit juste inutile), un assembly compilé en /out:Library (donc ce qu'on appelle une DLL) ne peut pas etre demarré, il sera juste parcouru par les autres assemblies faisant des appels dessus.

    Pour le Datareceived, je ne sais pas trop comment ca marche, mais j'imagine que tu dois initialiser la classe et la classe emet des events (datareceived ici) quand elle entends quelque chose. Les callbacks de ces events seront executés par un thread du pool (au meme titre qu'un timer si tu veux, tu init un timer les callback d'elapsed sont levés par un thread tiers).

    Bref, dans une DLL, si cette derniere ne créé pas explicitement de thread (new thread blabla) ou implicitement (le datareceived par exemple, mais aussi des methodes async quelconque), la problematique du thread est reporté vers l'appelant.

    En esperant avoir ete plus clair. =)
    Salut SirJulio,
    C'est plus clair, en effet. Merci pour tes précisions.

Discussions similaires

  1. DLL MultiThread qui lance une autre DLL
    Par rgarnier dans le forum Langage
    Réponses: 0
    Dernier message: 04/08/2011, 09h42
  2. Multithreaded DLL runtime
    Par ritchyv dans le forum Dev-C++
    Réponses: 0
    Dernier message: 27/02/2009, 15h50
  3. Multithread ou multithread DLL?
    Par Finarfin86 dans le forum Visual C++
    Réponses: 1
    Dernier message: 17/01/2009, 23h17
  4. Chargement d'une DLL et utilisation du multithread
    Par Maitre Kanter dans le forum Langage
    Réponses: 6
    Dernier message: 07/09/2004, 23h18
  5. Multithread, pointeur et dll
    Par jakouz dans le forum Langage
    Réponses: 4
    Dernier message: 25/06/2004, 14h37

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