begin process at 2012 05 30 10:32:15
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Général

 > 

Utilisation de fonctions Callback


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Utilisation de fonctions Callback

lundi 23 juillet 2007 à 16:08:39 | Utilisation de fonctions Callback

N0euX

 Bonjour a tous,

 

Je suis actuellement confronte a un probleme de fonction callback.

J utilise une librairie pour controler un peripherique. Dans celle-ci, il y a une fonction dont la declaration est la suivante :

 

typedef void (WINAPI *NOTIFICATION_CALLBACK) (HANDLE cyDevice, DWORD dwNotify, DWORD dwUser);

// cyDevice = Handle to device triggering callback

// dwNotify = Reason for callback

// dwUser = User-defined parameter

// Subscribe for event notifications such as ready-to-read

// Only one subscriber callback per device

// Returns OK or an error code

DWORD SubscribeNotifications

(

    HANDLE cyDevice, // Handle obtained from Open()

    NOTIFICATION_CALLBACK callback, // Pointer-to-function for callback

    DWORD dwUser // User-defined parameter to pass to callback

);

 

Je cherche a utiliser la fonction SubscribeNotifications dans mon programme c++ mais je ne connais pas grand chose aux fonctions callback.

Pour cela, je cree une fonction telle que :

 

void WINAPI OnUser(HANDLE hanReader, DWORD dwNotify, DWORD dwUser)

{

    // mon code

}

 

Et par la suite, dans mon main, je fais appel a ma fonction Subscribe_notifications :

 

RFID_NOTIFICATION_CALLBACK callback;

callback = (RFID_NOTIFICATION_CALLBACK)OnUser;

DWORD dwUser;

cout << "Error Code sub notif " << RFID_SubscribeNotifications(hanReader,callback,dwUser) << endl;

 

Logiquement, a chaque evenement sur mon peripherique, la fonction OnUser devrait s executer (en tout cas c est mon but) mais ce n est pas le cas.. Je ne sais pas si c est moi qui ne comprends pas grand chose aux callback (c est bien possible) mais j aimerais bien savoir que faire pour corriger mon erreur svp.

 

Merci d avance.

lundi 23 juillet 2007 à 17:44:00 | Re : Utilisation de fonctions Callback

acx01b

salut
pourquoi mets tu sans RFID_ puis avec RFID_ ensuite ?

ils disent HANDLE cyDevice, // Handle obtained from Open()
dans ta lib, tu as passé le bon ?

lundi 23 juillet 2007 à 18:05:53 | Re : Utilisation de fonctions Callback

ctx_man

Salut ! Déjà petite simplification : RFID_SubscribeNotifications(hanReader, (NOTIFICATION_CALLBACK)OnUser, 0); Redéfinir un pointeur local pour ton callback sert strictement à rien. Le DWORD dwUser c'est fait pour passer un paramètre à ta fonction callback, tu t'en sert pas alors ne définit pas une varible locale pour la passer à ton callback, surtout que tu ne l'initialise pas, tu ne sais pas ce qu'il y a dedans. Ensuite, meme remarque que acx01b, c'est marquer "NOTIFICATION_CALLBACK callback, // Pointer-to-function for callback" donc d'où vien le "(RFID_NOTIFICATION_CALLBACK)". Et comment as-tu obtenu ton hanReader ?
lundi 23 juillet 2007 à 19:08:03 | Re : Utilisation de fonctions Callback

N0euX

desole, autant pour moi je n etais trompe en recopiant mon code donc le RFID est une erreur qui n y est normalement pas (jai modifie le post en consequence)

acx01b, comment sa passer le bon handler? je pensais que comme la fonction allait s executer au declenchement d un evenement, les parametres etaient transmis automatiquement.. (un peu comme en vb .net ou on peut recuperer des informations sur levenement qui se declenche, ici je pensais que les infos etaient le handler declencheur, levenement dwNotify et le dwUser d ou est issu l evenement ) sinon je ne vois pas comment gerer cela.

ctx_man, oui j ai enleve la redefinition du pointeur local, juste comme cela ne marchait pas j ai un peu tout teste (enfin, tout ce que je sais faire). Pour le parametre a passer a la fonction callback, je sais que jen ai pas besoin mais je ne sais pas quoi passer a ma fonction SubscribeNotification si je ne definis pas un DWORD quelconque..
Le hanReader est obtenu auparavant dans le main tel que "hanreader = open(1)" (1 etant le numero du periph, la fonction open marche correctement jai pu tester dautres fonctions par le suite utilisant le handreader)

lundi 23 juillet 2007 à 19:41:58 | Re : Utilisation de fonctions Callback

racpp

Administrateur CodeS-SourceS
Salut,
Je ne connais pas SubscribeNotification(). Elle appartient à quelle librairie?
Pour que ta fonction CallBack soit appelée, il faut qu'elle soit correctement enregistrée par le service de notification concerné.  C'est sûrement le role de SubscribeNotification(). Es-tu sûr que ce service est actif?
mardi 24 juillet 2007 à 08:28:06 | Re : Utilisation de fonctions Callback

ctx_man

Salut, je passe en couranr juste pour te dire que j'avais répondu à "je sais que jen ai pas besoin mais je ne sais pas quoi passer a ma fonction SubscribeNotification si je ne definis pas un DWORD quelconque". DWORD = Double Mot = 4 octets = 32 bits = unsigned int petit rappel, un nombre sortit direct dans le code est un int par défaut. RFID_SubscribeNotifications(hanReader, (NOTIFICATION_CALLBACK)OnUser, 0); Voila le petit 0 à la place de la variable. Plus l'allocation et un paramètre que tu connais. De mannière générale, la majoritée des fonctions sont faite de telle sorte que quand tu sais pas quoi mettre comme paramettre, tu met 0 ou NULL (sachant que NULL n'est qu'un define de 0)
mardi 24 juillet 2007 à 09:51:07 | Re : Utilisation de fonctions Callback

N0euX

racpp , SubscribeNotification est fournie dans la librairie de mon periph, et permet, moyennant le passage d une fonction de callback d effectuer des operations que lon veut lors de l occurence d un evenement. le service est cense s activer par cette fonction elle meme..  d apres la doc, donc si cela ne marche pas, c est que je dois mal appeler ma fonction d apres moi.. (meme si elle ne me renvoit pas une erreur) 

ctx_man, merci pr les infos, jai hesite a mettre null mais je savais pas si cela correspondait a un dword. Avec ta syntaxe, l execution est correcte mais il n execute pas de callback comme je le voudrais..

mardi 24 juillet 2007 à 10:07:11 | Re : Utilisation de fonctions Callback

ctx_man

En fait mettre 0 ce n'est pas tou a fait un DWORD. Le DWORD c'est un define (ou un typedef je sais plus) de unsigned int. Si tu ne met pas de préfixe/suffixe pour indiquer la nature de ta constante, alors le compilateur décide que c'est un int tout court (donc un signed int). Cependant, tant que les valeurs que tu met restent dans la fourchette positive d'un signed int, le compilo dira rien car aucun risque de perte de donnée. Pour en revenir à ton problème : tu es absolument certain qu'il n'execute pas ton callback ? Je veux dire par la que si ta facon de tester si ta fonction callback est appellée c'est de mettre un printf ou un messagebox a l'intérieur de cette fonction, alors tu ne peux être certain qu'elle n'est pas appellée. Met un point d'arret dans ta fonction callback, par exemple sur le return en écrivant ton callback comme suit : void WINAPI OnUser(HANDLE hanReader, DWORD dwNotify, DWORD dwUser) { return; //<---point d'arret à poser ici. } C'est une bonne mannière d'etre sur de savoir si tu passe par ton callback ou non. Sinon, es-tu sur que c'est tou ce qu'il faut faire ? La doc ne fait pas état d'une fonction d'initialisation du système de notification ou quelque chose à faire avant/apres ton RFID_SubscribeNotifications ?
mardi 24 juillet 2007 à 12:38:40 | Re : Utilisation de fonctions Callback

N0euX

en fait je vais revenir sur mon programme.
c est une application c++ console que jappelle avec un parametre apres compil tel que "monprog param". jusque la mormal. suivant le parametre dans le main de mon programme, on discute avec le periph en lui envoyant des commandes, puis le programme termine. dans le cas present, jappelle avec /subnotif comme parametre et apres dans le main je fais donc appel a SubscribeNotifications qui est cense (d apres la doc) initialiser le systeme de notification, en lui precisant la fonction de callback (celle ci etant dans mon programme, en dehors du main). mais apres, lors de l evenement, le programme n etant pas lance, je ne vois pas comment cela peut fonctionner et comment le periph peut executer ma fonction..

ainsi, je ne sais pas comment mettre de point d arret n etant pas en debug.. pour le moment je verifie si lecriture dans un fichier est effectuee ou pas, et ce n est pas le cas.

la seule chose precisee par la doc a faire en dehors dappeler cette fonction est d autoriser l occurence des evenements qui m interessent sur le periph, et cela marche car jai pu le verifier autrement. c est juste que je narrive pas a le recuperer loccurence de cet evenement (et ainsi pouvoir le traiter).

mardi 24 juillet 2007 à 13:06:02 | Re : Utilisation de fonctions Callback

ctx_man

Re ! En fait, avec VS (et certainement la majoritée des IDE) tu peux passer des paramètres a ton programme en mode debug. La configuration de la ligne de commande lançant ton programme en mode debug est souvent placée dans les propriétées du projet. Tu peux donc quand même lancer ton programme en mode debug avec le point d'arret. Sinon tu peux te servir du paramètre de ta fonction calback pour passer un pointer qui te permettra de retourner une valeur ou je ne sais quoi d'autre. Petit question : Si ton programme se termine juste apres avoir fait ton subnotif, c'est plutot normal que la callback soit pas appelé puisque le programme référencant la fonction est terminé. Donc, tu n'es pas sensé boucler sur quelque chose ?

1 2

Cette discussion est classée dans : fonction, handle, callback, dword, dwuser


Répondre à ce message

Sujets en rapport avec ce message

Probleme de timer avec fonction de callback [ par julienbj ] Bonjour,j'ai un petit souci lors de la création d'un timer avec une fonction de callback.Voici un bout de code qui ne fonctionne pas, mais je ne vois Passer un pointeur sur une instance à une fonction membre static ? [ par tintin72 ] Bonjour, j'ai un problème pour passer un pointeur sur une instance ou l'adresse de l'instance à une fonction callback Windows. Je m'explique J'ai créé implementation d'une fonction callback pour l'appel à une DLL [ par 3asfoura ] Hi all!J'utilise visual c++ 6.0.J'ai une DLL client dont je connais seulement les noms de fonctions visualisés sous "Dependency walker". Je veux imple Adresse d'une fonction CallBack dans une classe [ par Capa6T ] Bonjour, J'ai un petit souçis pour récupèrer l'adresse d'une fonction CallBack dans une classe. MaClasse.h : ------------ class MaClasse { protected JNI natif -> Java - appeler java depuis une fonction callback??? [ par rachmasse ] salu,Voila j'essaye depuis plusieurs jours deja  de faire remonter à JAVA mes evenements detectés grace aux fameux hook.Le problème est que je n'arriv Problème avec la fonction callback du timer [ par Arkadias ] Bonjour tout le monde, je suis confronté à un problème de timer.Voila la situation :Dans le cadre d'un projet de conversion de protocole, je récupère Appel fonction avec GTK+ [ par ptityo31 ] Bonjour,je débute sur GTK+, et j'aimerai avoir des précisions sur le lancement d'une application à partir d'un clic.En effet je dois envoyer des trame Fonctionnement de la Winpcap [ par myanaa ] Bonjour à tous,Actuellement, je travail sur un projet en relation avec la lib Winpcap. Et je me pose certaines questions, dont je n'ai pas trouvé de r Obtenir l'handle d'une DLL [ par TryToHelpMe ] Bonjour,J'ai un nouveau problème que je n'arrive pas à résoudre.J'ai besoin de récupérer l'handle de ma DLL.Je fait appel à ma DLL depuis un programme


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,593 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales