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. #1
    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 [C#] DLL multithread
    Bonjour,
    Je dois programmer une DLL qui va recevoir des requêtes d'un programme externe, les mettre dans une collection, et ensuite traiter les requêtes.
    J'aimerais qu'un thread s'occupe de recevoir les requêtes du programme, et les mette dans la collection, et qu'un autre thread s'occupe de traiter les requêtes.
    Ma question est : est-ce qu'un seul thread peut s'occuper de recevoir les requêtes et les mettre dans la collection, ou faut-il créer un nouveau thread à chaque requête ? Les 2 sont-ils réalisables et y aurait-il une possibilité meilleure que l'autre ? Il se peut que plusieurs requêtes arrivent en même temps.
    Merci d'avance pour vos réponses.

  2. #2
    Membre Expert Avatar de LaChips
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 109
    Par défaut
    Bonjour,

    Tu peux créer un thread qui va recevoir les requêtes.
    Ce thread quand il en reçoit une déclenche un nouveau thread qui va placer dans une collection. Et enfin un dernier thread qui exécute les requêtes de la collection

  3. #3
    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 LaChips Voir le message
    Bonjour,

    Tu peux créer un thread qui va recevoir les requêtes.
    Ce thread quand il en reçoit une déclenche un nouveau thread qui va placer dans une collection. Et enfin un dernier thread qui exécute les requêtes de la collection
    Bonsoir,
    Merci pour ta réponse rapide.
    Je vois ce que tu veux dire. Mais comment dois-je programmer le "thread qui va recevoir les requêtes" ? L'invocation de la DLL doit-elle se produire par appel de fonction qui va informer le thread ?

  4. #4
    Membre Expert Avatar de LaChips
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 109
    Par défaut
    En fait cela dépend de comment est architecturé ton application qui utilisera la DLL

  5. #5
    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 LaChips Voir le message
    En fait cela dépend de comment est architecturé ton application qui utilisera la DLL
    Mon application qui utilise la DLL appelle une fonction définie dans la DLL. Je ne vois pas ce que tu veux dire par comment elle est architecturée ?

  6. #6
    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
    Bonjour,

    Où sera hébergée la DLL ? (une DLL par définition n'est pas exécutable directement)
    Quel est le protocole utilisé pour la communication entre le programme externe et la "DLL" ?
    Quelle est l'implémentation de la collection choisie ? Certaines implémentations peuvent effectivement avoir des fonctions d'ajout dans certains cas de complexité O(n+1) où n est le nombre de requêtes en attente.

  7. #7
    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
    Bonjour,

    Où sera hébergée la DLL ? (une DLL par définition n'est pas exécutable directement)
    Quel est le protocole utilisé pour la communication entre le programme externe et la "DLL" ?
    Quelle est l'implémentation de la collection choisie ? Certaines implémentations peuvent effectivement avoir des fonctions d'ajout dans certains cas de complexité O(n+1) où n est le nombre de requêtes en attente.
    La DLL sera hébergée dans un projet visual studio 2005 avec l'application qui n'est qu'une interface graphique de test pour l'instant.
    Le programme externe invoque la DLL avec un simple appel de fonction.
    La collection est une ArrayList.

    Merci d'avance.

  8. #8
    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
    Bonjour,

    J'ai du mal à voir où est le programme "externe". En fait, ton programme utilise une DLL que tu as écrites et qui est donc réutilisable par d'autres applications. Il n'empêche que ton application charge la DLL dans son appdomain et que par conséquent il n'est pas un programme "externe" pour les fonctions de la DLL.

    ArrayList est une très mauvaise implémentation de collection pour effectuer une queue de requêtes à mon avis. De plus, il faudrait lui préférer son équivalent générique List.

  9. #9
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Citation Envoyé par Kaidan Voir le message
    ArrayList est une très mauvaise implémentation de collection pour effectuer une queue de requêtes à mon avis. De plus, il faudrait lui préférer son équivalent générique List.
    Certes, mais si c'est pour implémenter une file, autant utiliser l'objet adéquat : Queue.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  10. #10
    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 SaumonAgile Voir le message
    Certes, mais si c'est pour implémenter une file, autant utiliser l'objet adéquat : Queue.
    OK

    Citation Envoyé par Kaidan Voir le message
    Bonjour,

    J'ai du mal à voir où est le programme "externe". En fait, ton programme utilise une DLL que tu as écrites et qui est donc réutilisable par d'autres applications. Il n'empêche que ton application charge la DLL dans son appdomain et que par conséquent il n'est pas un programme "externe" pour les fonctions de la DLL.
    Mon application n'est pas un programme externe mais ma DLL doit effectivement être réutilisable par d'autres applications.
    Je repose donc ma question : comment réaliser l'appel de la DLL sachant qu'un thread va recevoir les requêtes de l'extérieur ?

  11. #11
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    L'appel à l'assembly ne change pas, c'est à la méthode appelée de créer un thread pour traiter les données. Pour l'application externe ce thread sera invisible.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  12. #12
    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 SaumonAgile Voir le message
    L'appel à l'assembly ne change pas, c'est à la méthode appelée de créer un thread pour traiter les données. Pour l'application externe ce thread sera invisible.
    OK. Pensez-vous que cela puisse fonctionner sans thread ? c'est-à-dire que la fonction appelée mette la requête dans une Queue pendant que le programme principal traite les requêtes qui sont dans la Queue.

  13. #13
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Pour effectuer les traitements en parallèle, il faut passer par des threads.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  14. #14
    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 SaumonAgile Voir le message
    Pour effectuer les traitements en parallèle, il faut passer par des threads.
    Je me demande si ca serait pas intéressant d'utiliser un threadpool, car ma DLL va agir en tant que serveur. J'hésite entre des threads "normaux" et un threadpool. Qu'en pensez-vous ?

  15. #15
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Le threadpool est une bonne solution, ça t'épargne une partie du travail. Mais garde à l'esprit que même si tu gères les threads à la main, ils proviennent du même threadpool que ceux gérés par le framework.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  16. #16
    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
    OK. Je vais essayer avec un threadpool.
    Merci à tous pour vos réponses.

  17. #17
    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,
    Je pense donc programmer ma DLL "serveur" en utilisant un pool de threads.
    Ensuite les requêtes doivent être envoyées à un automate programmable, pour l'instant une seule à la fois, et ensuite il pourrait y avoir plusieurs communications simultanées avec les automates.
    Est-ce que j'aurai encore besoin d'une queue qui va stocker les requêtes, ou le pool de thread va-t-il s'occuper de cela ?
    Merci d'avance pour votre avis.

  18. #18
    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
    Ca dépends encore une fois de ton architecture.

    Si tu veux intercepter plusieurs requêtes en même temps et les dispatcher directement vers ton automate (qui va donc dans certains cas devoir gérer plusieurs requêtes en même temps) utilise directement ThreadPool.QueueUserWorkItem pour placer chaque exécution de requête en fille d'attente.

    Si tu veux intercepter plusieurs requêtes en même temps mais dispatcher dans ton automate une à une, il va falloir utiliser une Queue entre le ThreadPool et le thread chargé d'envoyer dans l'automate.

  19. #19
    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 tu veux intercepter plusieurs requêtes en même temps mais dispatcher dans ton automate une à une, il va falloir utiliser une Queue entre le ThreadPool et le thread chargé d'envoyer dans l'automate.
    Voici la solution que je retiens.
    Pensez-vous 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 ?

    Autre question : J'ai lu que le threadspool du .NET Framework ne gère que 25 threads. Que se passe-t-il si par exemple 30 requêtes arrivent en même temps ?

    Merci d'avance.

  20. #20
    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
    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 ?

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