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 :

Une DLL pour plusieurs programmes


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 14
    Points : 11
    Points
    11
    Par défaut Une DLL pour plusieurs programmes
    Bonsoir,

    je viens ici pour vous demander votre aide.

    Explications :

    J'ai créé une dll en C# contenant plusieurs classes (Réseaux(TCP & UDP), WebClient (Download & Upload), etc...) qui à la base serait utilisable par plusieurs programmes, selon ses besoins.

    Par exemple, j'ai envie de faire une sorte de messagerie instantanée en UDP, alors je créé mon projet, j'importe ma dll (via using) et j'appelle les fonctions de la dll dont j'ai besoin. Pour UDP par exemple, je fais (pour le côté serveur)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    string IPaddr = Console.ReadLine();
    string Port = Console.ReadLine();
    UDPServer.Init(IPaddr, Convert.ToInt32(Port));
    et à partir de là, la fonction "Init" de la classe "UDPServer" située dans ma dll se charge de la création du serveur UDP avec les informations passées en paramètre depuis ma toute nouvelle application.

    Mon problème n'est pas lors de la création du socket (j'ai une classe Log qui me log tout ce qui se passe, je peux donc voir où il y a un problème, si problème il y a).
    Mon problème, est un problème de récupération des messages reçus pour cette classe en particulier, donc de retour de variable pour l'ensemble de la dll.

    Je m'explique : Dans la classe "UDPServer", j'ai une fonction "Receive" qui va convertir les messages reçus de bytes en string et ensuite me logguer le message reçu. Seulement, si je souhaite créer une application, qui a besoin de voir les messages (imaginons juste pour les afficher à la manière d'un Console.WriteLine();, ou bien pour traiter les messages reçus), et bien c'est tout bonnement impossible (du moins, je n'ai pas réussi).

    La seule manière que j'ai trouvé, est qu'à chaque fois que je reçois un message, je stock ce message dans un tableau (issu d'une autre fonction) et depuis mon nouveau programme, j'appelle la fonction contenant le tableau qui me renvoie la première case du tableau (donc le dernier message reçu) et ensuite je peux l'afficher.

    Cependant, j'utilise un while et c'est assez gênant et je me demandais si il était possible de récupérer la valeur du message (directement transformée de bytes en string) au moment où le message est reçu sans se casser la tête à stocker le message dans un tableau et lire la première case du tableau via un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while(tableau[0] != ""){
    Console.WriteLine(tableau[0]);
    }
    En espérant avoir été clair, si vous avez des questions n'hésitez pas.

    Merci d'avance

  2. #2
    Inactif  

    Homme Profil pro
    développeur Vala
    Inscrit en
    Février 2011
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : développeur Vala
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 478
    Points : 3 700
    Points
    3 700
    Par défaut
    bonsoir .
    si ton application est destinée à un serveur, je te conseillerais d'utiliser sql server, et de créer une table log ou tu mettras tes messages. si ça te convient, on continue la discussion en forum sql-server ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Bonjour,

    Pour éviter un tableau (pile, file ou autre collection), tu pourrais lancer un événement pour chaque message reçus.
    Mais ce n'est pas terrible en terme de performance si tu reçois bcp de message, et que tu met longtemps à les traités.

    Ta première idée est bonne, chaque messager reçus par ton serveur sera empiler dans une file.
    Après tu aura une autre classe qui viendra dépiler le contenu de cette file.
    Tu n'es pas obligé de passer par une fonction, tu peux simplement mettre une propriété retournant la file.
    Dans ces conditions tu peux même passer en multithread, à savoir un thread qui lis la socket (methode Receive dans le cas d'un UdpClient), un thread qui depile ta file et traite les messages.

  4. #4
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 493
    Points
    5 493
    Par défaut
    Bonsoir.

    Si je comprends bien, actuellement, un thread stocke des éléments dans un tableau et un autre thread exécute une boucle while pour les lire ?

    Typiquement, pour ça on utilise des WaitHandle (google). Un thread utilise "waitHandle.Wait()" pour attendre un message et il est réveillé dès que l'autre fait "waitHandle.Set()" à la réception d'un message.

    Mais comment est gérée la synchronisation entre le thread qui empile et le thread qui dépile ? Une ConcurrentQueue serait toute indiquée. Qui plus est, s'il y a plus d'un thread à observer la pile de messages et qu'ils doivent *tous* être informés de *tous* les messages, un événement sera plus indiqué.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Bonsoir,

    Premièrement, merci de vos réponses rapides et détaillées.

    @rotrevrep :
    Je ne souhaite pas utiliser sql-server, mais merci tout de même pour l'idée

    @antoine.debyser & @DonQuiche :
    Je vais regarder du côté de google à propos de vos propositions même si celle de DonQuiche me paraît être la meilleure en terme de performances.

    Sinon pour DonQuiche, pour le moment, lorsque je reçois un message depuis UDPServer/UDPClient intégrés dans ma DLL, un tableau qui est créé dans ma DLL stocke ces messages.

    Et depuis une application quelconque qui appelle cette DLL, il y a une boucle while qui lit le tableau pour inscrire les nouveaux messages.

    Je vais regarder de mon côté, malgré que je pense que je devrais revenir ici pour obtenir plus d'informations.

    Je vous souhaite une bonne soirée et merci encore

Discussions similaires

  1. creer une dll pour programme etranger
    Par lez-j dans le forum C++
    Réponses: 1
    Dernier message: 28/02/2010, 07h41
  2. Réponses: 2
    Dernier message: 16/12/2009, 13h36
  3. [DLL] Utilisation d'une DLL pour utiliser serveur Firebird
    Par sekiryou dans le forum Bases de données
    Réponses: 2
    Dernier message: 11/08/2004, 14h20
  4. Comment créé une "interface" pour mes programmes??
    Par alcazar dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 09/02/2004, 13h02
  5. [] Utiliser AVI d'une DLL dans mon programme
    Par seb.49 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 02/05/2003, 14h52

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