Oeil_de_taupe
Messages postés150Date d'inscriptionsamedi 31 janvier 2004StatutMembreDernière intervention16 février 2009
-
16 avril 2005 à 18:01
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 2006
-
18 avril 2005 à 09:14
Bonjour tout le monde,
J'ai créé deux classes qui représentent un protocole pour envoyer des
données entre deux PC. Lors de l'appele de leur constructeurs elles
demandent un pointeur sur une fonction afin d'envoyer des messages
d'information sur la connection par protocole (un peu comme la fonction
WndProc qui reçoit des messages sur la fenêtre ouverte).
Dans ma classe de décodage du protocole, mon constructeur demande un
pointeur de type pFunc ou pFunc est déclaré de cette manière:
Il existe en plus des deux classe représentant le protocole, deux
autres classes qui s'occupe que de la connection par Socket entre les
deux ordinateurs.
Dans la classe serveur (qui contient celle de décodage du protocole) un
thread se lance pour l'écoute avec un socket (c'est donc une fonction
static). Je passe le pointeur de toute la classe au thread pour qu'il
puisse accèder à sa classe (chose qui est impossible normalement avec
une fonction static)
J'utilise donc le constructeur de la classe qui traite le protocole
dans un thread d'une autre classe. Voici la création de la calsse
depuis le thread: lLocal->lDecodeur = new
CTDecode(lLocal->MessageReceive, csock);
où
lLocal est le pointeur sur le tout de la classe (pour que la fonction static puisse accéder à sa classe, paramètre du thread)
lDecodeur est un pointeur sur la classe de décodage utilisée
et lLocal->MessageReceive est un pointeur sur la fonction qui permet de récupérer les messages de la classe protocole
(csock est un bête socket déjà connecté)
MessageReceive est une fonction qui reçoit les message (elle n'est pas static). Voici son prototype:
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 16 avril 2005 à 20:11
A la compilation le compilo doit savoir l'adresse de la fonction, si elle est membre de classe elle est chargée dynamiquement à l'instanciation de la classe et donc pas d'adresse fixe.
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 18 avril 2005 à 09:14
Petite précision : les fcts membres des classes ont une adresse fixe (les fct virtuelles sont à placer un peu à part mais bon). La raison pour laquelle elle ne peuvent servir de CALLBACK à l'API Windows c'est que toutes les fct membres des classes (non statiques) ont un argument supplémentaire implicite (this) que l'API Windows est incapable de fournir.
Il y a un moyen de passer une fct membre nons tatique d'une classe en CALLBACK à une autre fonction mais c'est plus délicat (le type de la CALLBACK doit contenir le nom de la classe). Les MFC s'en servent pour la table des messages. Mais cette technique n'est pas possible pour toi car le type de la CALLBACK est déjà fixé par une API.
Oeil_de_taupe
Messages postés150Date d'inscriptionsamedi 31 janvier 2004StatutMembreDernière intervention16 février 2009 16 avril 2005 à 19:59
Ho!!!
Tu as raison... Mais... Oulala!!! Je me sens vieillir .
C'est pas possible, j'ai bloqué pendant une journée sur ce problème et
tu me donne la solution en une phrase, alors qu'il me semblait que
j'avais déjà tester ce que tu avais dit avant!!!
Mais sait tu pourquoi on ne peut pas donner le pointeur d'un fonction
en non-static depuis une fonction static (alors que ces deux fonctions
sont dans la même classe)...
La taupe voit toujours tout (sauf les bugs)
Vous n’avez pas trouvé la réponse que vous recherchez ?