C# méthode en paramètre d'une méthode

freemaul Message lu Posté le 30 Nov 2008 à 18:20 Bulle
Avatar de freemaul
Explorateur

Messages : 174
GCPoints : 50213
Bonsoir tous le monde,

ma question porte sur le language C# et non C ou C++ mais bon je pense c'est le bon endroit pour poser la question.


Je voudrais savoir coment faire pour passer une méthode en paramètres dans une autre méthode.

en fait j'essai de faire une bibliothèque C# pour pouvoir géré facilement des serveur (pour mes futur créations peut etre) , pour cela j'utilise donc un thread pour chaque client connecté au serveur, thread qui recoit les donéés, or le traitement des données doit se faire dans une fonction en dehors de la DLL, dans une méthode du genre :
Code :
void traitement(string message);

mais je ne voit pas comment je peut faire pour que mon thread (codé donc dans la DLL) puisse appeler la méthode en lui passant en paramètre les données recu.

J'espère avoir été clair, et j'espère aussi qu'il y a quelques personnes qui d'y connaisse un peu en C# ^^

bonne soirée
"La vie n'a pas de prix, mais elle coûte chère"
Mod Message lu Posté le 30 Nov 2008 à 18:31 Bulle
Avatar de Mod
Webmaster

Messages : 4954
GCPoints : 2100823
Vu que les pointeurs de fonction n'existent pas vraiment en C#, tu devrais à mon avis regarder du côté des delegate : http://msdn.microsoft.com/fr-fr/library/900fyy8e.aspx, si j'ai bien compris ton problème, cela correspond à ce que tu recherches. N'ayant jamais vraiment eu l'occasion de les exploiter, je ne m'étendrai pas dessus.

Je déplace le sujet en section "Programmation", le C# n'a pas tant de choses en commun avec le C et le C++ ;).
freemaul Message lu Posté le 30 Nov 2008 à 18:58 Bulle
Avatar de freemaul
Explorateur

Messages : 174
GCPoints : 50213
Merci beaucoup

j'avait en effet entendu parler des delegate, mais les exemples que je trouvais n'était pas trés facil à comprendre.

J'ai donc compri comment faire , et pour ceux que ca intéresse voila comment j'ai donc fait :

dans ma classe Serveur (donc dans la DLL) :

Code :
public delegate void Mess(string mess);
...
public void Set_message(Mess mess)
{
    mess("test");
}
...


est donc dans le programme qui utilise la dll :
Code :
void traitement(string mess)
{
....
}

static void main()
{
Serveur test=new Serveur();
test.Set_message(traitement);
}
"La vie n'a pas de prix, mais elle coûte chère"
Gulix Message lu Posté le 01 Déc 2008 à 09:22 Bulle
Avatar de Gulix
Membre Confirmé

Messages : 184
GCPoints : 8860
Quelle version de C# tu utilises ? Parce qu'à partir de la version 2.0, les méthodes anonymes te permettent des trucs vraiment sympas. Qui plus est, tu n'utilises pas vraiment les delegates de la meilleure façon. :wink:

Un delegate te permet de stocker plusieurs méthodes. Tu pourrais ainsi envoyer plusieurs types de messages à ton serveur (sortie console, fichier texte, bdd, ...), et lui n'exécuterait que la fonction delegate (une seule ligne de code) mais derrière, toutes tes méthodes se lanceront.

Code du serveur :

Code :
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Serveur
    {
        public delegate void Message(string message);

        public Message ServerMessage;

        public void DoMessage(string myMessage)
        {
            ServerMessage(myMessage);
        }
    }
}


Je n'ai pas changé grand chose ici, sauf qu'on passe le message en paramètre, et que la variable delegate (Message ServerMessage) est accessible en lecture/écriture (public).

Code du Main :

Code :
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Serveur myServer = new Serveur();
            myServer.ServerMessage += delegate(string myMessage) { Console.WriteLine(" --> {0}", myMessage); };
            myServer.ServerMessage += delegate(string myMessage) { Console.WriteLine(" +++ {0}", myMessage); };
            myServer.ServerMessage += delegate(string myMessage) { Console.WriteLine(" !!! {0}", myMessage); };

            myServer.DoMessage("Test du premier");
            myServer.DoMessage("Test du second");
        }
    }
}


C'est là que j'utilise des méthodes anonymes. Comme ce sont des codes courts, on peut directement les intégrer dans le code, sans avoir à déclarer une nouvelle fonction. On ajoute les valeurs avec += sur la variable delegate. Les trois fonctions seront exécutées dans l'ordre de leur insertion, avec le paramètre fourni dans DoMessage(). Au niveau du contenu des méthodes, j'ai fait trois sorties console, mais tout est acceptable.

J'espère t'avoir aidé :grin: N'hésite pas à me poser des questions !
Dernière édition le 01 Déc 2008 à 09:22
"Bien souvent, l'école représente votre meilleure chance. Non pas d'apprendre quoi que ce soit, bien sûr, mais de survivre à une attaque de morts-vivants".
Max Brooks - Guide de survie en territoire zombie

Mon Blog, mélange de prog' et de culture
Blind Shark - Pull N' Bounce
freemaul Message lu Posté le 01 Déc 2008 à 15:27 Bulle
Avatar de freemaul
Explorateur

Messages : 174
GCPoints : 50213
ok merci, c'est presque ca en fait.

Les deux différences :

- Je veut une fonction qui gère le traitement du message en dehors du main (vu que le traitement n'est pas simplement un affichage, mais si j'ai bien compri il me suffi de remplacer :
Code :
myServer.ServerMessage += delegate(string myMessage) { Console.WriteLine(" +++ {0}", myMessage); };

par :
Code :
myServer.ServerMessage += mafonction;

c'est ca ?


- Deuxièmement , ce sont les fonctions écrite dans la classe Serveur qui doivent appeler la fonction de tratement, mais donc la (encore une fois si j'ai bien compris ^^) , il suffit de déplacer le code :
Code :
myServer.DoMessage("Test du premier");

par
Code :
DoMessage("Test du premier");

Dans une fonction appartenant à la classe Serveur ?

Sinon j'utilise la version 3.5 il me semble, ayant télécharger le logiciel il y a peu.


Petite question en passant , les DLL créer en C# ne sont utilisable qu'en C# ? ou est-ce possible de le coder de manière à être utilisable en C++ ( ou meme en C mais cela métonnerais beaucoup vu la programmation objet) ?

"La vie n'a pas de prix, mais elle coûte chère"
Gulix Message lu Posté le 01 Déc 2008 à 15:46 Bulle
Avatar de Gulix
Membre Confirmé

Messages : 184
GCPoints : 8860

Citation :

- Je veut une fonction qui gère le traitement du message en dehors du main (vu que le traitement n'est pas simplement un affichage, mais si j'ai bien compri il me suffi de remplacer :
Code :

myServer.ServerMessage += delegate(string myMessage) { Console.WriteLine(" +++ {0}", myMessage); };


par :

Code :
myServer.ServerMessage += mafonction;


c'est ca ?



C'est ça. Tant que ta fonction correspond au delegate (void (string) ici), ça passe. Tu peux très bien passer une fonction venant d'un objet :

Code :
Personnage
{
   string _sNom;
   public Personnage(string sNom)
   {
      _sNom = sNom;
   }
   
   public void Parle(string Message)
   {
      Console.WriteLine("{0} : {1}", _sNom, Message);
   }
}


Code :
static void Main(string[] args)
{
   Serveur myServer = new Serveur();
   Personnage myPersonnage = new Personnage("Barney");
         
   myServer.ServerMessage += myPersonnage.Parle;

   myServer.DoMessage("Test du premier");
   myServer.DoMessage("Test du second");

   Console.ReadLine();
}


Les méthodes anonymes permettent simplement d'éviter de créer une fonction qui ne sera utilisée que par le delegate. On évite ainsi d'avoir une fonction qui "encombre" la liste des fonctions d'une classe.


Citation :


- Deuxièmement , ce sont les fonctions écrite dans la classe Serveur qui doivent appeler la fonction de tratement, mais donc la (encore une fois si j'ai bien compris ^^) , il suffit de déplacer le code :

Code :

myServer.DoMessage("Test du premier");


par

Code :
DoMessage("Test du premier");


Dans une fonction appartenant à la classe Serveur ?



C'est exactement ça :yes:


Citation :



Petite question en passant , les DLL créer en C# ne sont utilisable qu'en C# ? ou est-ce possible de le coder de manière à être utilisable en C++ ( ou meme en C mais cela métonnerais beaucoup vu la programmation objet) ?



Les DLL C# (ou plus généralement .NET) ne sont pas du même format que les DLL "win32". Ce sont des DLL .NET, qui nécessitent donc de les employer dans un environnement managé, à travers une technologie .NET. Il est normalement possible d'utiliser un composant .NET (écrit en C#, VB.NET, C++/.NET, F#, ...) dans n'importe quel langage .NET. Donc, non, tu ne pourras pas réutiliser tes DLL écrites en C# dans des programmes en C ou C++ (sauf C++/.NET). Il existe des moyens de réussir, mais la DLL n'est alors plus utilisée dans son format original. C'est pas très recommandé.
"Bien souvent, l'école représente votre meilleure chance. Non pas d'apprendre quoi que ce soit, bien sûr, mais de survivre à une attaque de morts-vivants".
Max Brooks - Guide de survie en territoire zombie

Mon Blog, mélange de prog' et de culture
Blind Shark - Pull N' Bounce
freemaul Message lu Posté le 01 Déc 2008 à 17:17 Bulle
Avatar de freemaul
Explorateur

Messages : 174
GCPoints : 50213
OK, merci bien pour ces précisions.
"La vie n'a pas de prix, mais elle coûte chère"
freemaul Message lu Posté le 02 Déc 2008 à 14:54 Bulle
Avatar de freemaul
Explorateur

Messages : 174
GCPoints : 50213
Désoler d'abuser de ton savoir faire ^^,

mais serait tu comment faire avec une version inférieur à 2.0 ?

En effet venant de voir qu'il est possible d'utiliser "mono develop" pour développer des application sous linux, mais que les fonctions compatibles ne dépasse pas pour l'instant la version 2.0, j'aimerais bien autant que possible avoir des projets portable sous linux (et Mac puisqu'il a l'air compatible mac)


Bonne journée à tous !
"La vie n'a pas de prix, mais elle coûte chère"
Gulix Message lu Posté le 02 Déc 2008 à 15:09 Bulle
Avatar de Gulix
Membre Confirmé

Messages : 184
GCPoints : 8860
Si mes souvenirs sont corrects, les delegates s'emploient normalement dans la version 1.1. Les méthodes anonymes ne sont pas disponibles en revanche. Fais quand même attention à ce que tu développes en Mono. Je ne sais pas trop quel est ton but (appli web, winforms, XNA, Silverlight ?), mais au niveau graphique, pas mal de trucs sont pas implémentés dans Mono (ou ne sont pas stables).
"Bien souvent, l'école représente votre meilleure chance. Non pas d'apprendre quoi que ce soit, bien sûr, mais de survivre à une attaque de morts-vivants".
Max Brooks - Guide de survie en territoire zombie

Mon Blog, mélange de prog' et de culture
Blind Shark - Pull N' Bounce
freemaul Message lu Posté le 02 Déc 2008 à 15:20 Bulle
Avatar de freemaul
Explorateur

Messages : 174
GCPoints : 50213
ok merci, j'essairais chez moi.

Sinon je n'ai pour l'insant pas vraiment de projet définit, je fait surtout de la bidouille pour voir ce qu'il est possible de faire avec le C#, enfin pour l'insant je veut juste développer une librairies(ou bibliothèque j'arrive jamais à me souvenir ^^) pour créer facilement un serveur tout ce qu'il y a de plus banal (en mode console) , un client pour pouvoir dialoguer avec le serveur (en mode console ou non) , et une classe Serveur _http , dérivée de la classe Serveur pour pouvoir avec simplement quelques fonctions et quelques configuration créer un serveur http.

Donc pas d'interface graphique pour le moment, et je croit que pour linux il vaut mieu utiliser GTK pour cela (aprés je ne sait pas si c'est stable).
"La vie n'a pas de prix, mais elle coûte chère"
freemaul Message lu Posté le 02 Déc 2008 à 18:51 Bulle
Avatar de freemaul
Explorateur

Messages : 174
GCPoints : 50213
Alors la j'avoue que quelque chose méchappe, j'ai télécharger monodévelop sous linux, et lorsque je compile une bibliothèque il me génère un ".dll" et quand je compile un projet exécutable il me génère un ".exe" que linux ne peut pas lancer, jen conclu que c'est du dévelopement sous linux pour windows ? et je n'ai pas trouver le moyen de faire du dévelopement POUR linux !

:strange:



"La vie n'a pas de prix, mais elle coûte chère"
noob4ever Message lu Posté le 02 Déc 2008 à 20:00 Bulle
Avatar de noob4ever
Explorateur

Messages : 295
GCPoints : 48742
Essaye de lancer le .exe généré par Monodevelop et tu verras bien :grin: .
What did C:/DARTHVADER said to C:/DARTHVADER/LUKESKYWALKER ?

I'm your folder
freemaul Message lu Posté le 02 Déc 2008 à 22:15 Bulle
Avatar de freemaul
Explorateur

Messages : 174
GCPoints : 50213
lol, j'y avait penser ^^ , il me dit qu'il ne peut pas lancer cet exécutable...
"La vie n'a pas de prix, mais elle coûte chère"
noob4ever Message lu Posté le 03 Déc 2008 à 17:33 Bulle
Avatar de noob4ever
Explorateur

Messages : 295
GCPoints : 48742
Bizarre, les exe généré par mcs ( le compilateur de Mono ) sont des exe natif linux.
C'est quoi le message ?
What did C:/DARTHVADER said to C:/DARTHVADER/LUKESKYWALKER ?

I'm your folder
freemaul Message lu Posté le 03 Déc 2008 à 17:52 Bulle
Avatar de freemaul
Explorateur

Messages : 174
GCPoints : 50213
Quand je le lance en mode debug avec monodevelop , ca marche bien, les messages consoles sont écrits dans la fenêtre "sortie de l'application" :
Image



par contre quand je veut lancer l'application du dossier "release" avec un terminal :
Image


"fichier binaire impossible a lancer"


PS : dsl je vient de voir qu'on voit pas trés bien sur les screen , imagehacks a lair de baisser assez brutalement la qualité de l'image
"La vie n'a pas de prix, mais elle coûte chère"
freemaul Message lu Posté le 06 Déc 2008 à 17:08 Bulle
Avatar de freemaul
Explorateur

Messages : 174
GCPoints : 50213
Personne ne sait comment compiler une projet C# sous linux alors ? :confused:
"La vie n'a pas de prix, mais elle coûte chère"
Mod Message lu Posté le 06 Déc 2008 à 17:33 Bulle
Avatar de Mod
Webmaster

Messages : 4954
GCPoints : 2100823
Vraisemblablement, si le mode Debug fonctionne, mais pas le mode Release, c'est qu'il doit y avoir une différence notable dans la configuration des deux... A ce moment là, le plus simple est d'éliminer un par un les paramètres en partant d'un mode jusqu'à ne plus pouvoir utiliser l'exécutable, ou au contraire jusqu'à pouvoir l'utiliser.

Mais n'utilisant pas Mono, je ne saurais pas être plus utile que ça.
freemaul Message lu Posté le 06 Déc 2008 à 17:37 Bulle
Avatar de freemaul
Explorateur

Messages : 174
GCPoints : 50213
Ben apparement , quand je lance le mode debug , mono a lair d'émuler une console windows , c'est là que je comprend pas trés bien , ou alor je me suit tromper de version , parce que la sa ressemble plus à un soft pour programmer sous linux pour windows , je continu les recherches ^^



EDIT :

Citation :

Sous Linux, le programme produit n'est pas directement exécutable et doit être lancé en argument de l'interpréteur mono



Voila d'où vient le problème ^^
Donc pour fournir une application .NET sous linux , il faut aussi fournir l'interpréteur mono , un peu embétant tout ca ^^
Dernière édition le 06 Déc 2008 à 17:55
"La vie n'a pas de prix, mais elle coûte chère"
Répondre
GameCorp - Site d'apprentissage et d'entraide à la création de jeux vidéo.
XHTML Valid 1.1 - Page générée en 0.0553 secondes