8) salut
Bon; je voudrai savoir si oui ou non on peut concevoir son propre fonction callback.
si oui, comment fait on pour l'appeler.
merci.
8) salut
Bon; je voudrai savoir si oui ou non on peut concevoir son propre fonction callback.
si oui, comment fait on pour l'appeler.
merci.
peux-tu être plus explicite ?
veux-tu faire une routine qui appelle une fonction de callback ?
La réponse est oui grace à un pointeur sur fonction :
Imaginons le cas suivant :
Tu as une classe A avec une méthode Traitement().
Ce dernier fonctionne en faisant une boucle infinie par exemple...
Tu appelle ta méthode ObjectA.Traitement(...) et si tu n'utilise pas de thread, tu n'as pas d'information sur la progression de ton traitment jusqu'a la fin.
Maintenant imaginons, que tu veux signifier à la classe B l'état d'avancement de ton traitement, c'est possible en passant à ta méthode A::Traitement(...) un pointeur sur une fonction statique de la classe B.
En pratique :
dans ton fichier A.h tu définit le type pointeur sur fonction :
où pFunc décrit une fonction retournant un booléen et prenant un char * et un void *.
Code : Sélectionner tout - Visualiser dans une fenêtre à part typedef bool (*pFunc)(char *,void*);
puis :
et dans l'implémentation de ta fonction traitement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part void Traitement(\*tes params*\, pFunc InfoCallBak);
Ensuite dans ton fichier B.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 void A::Traitement(..., pFunc InfoCallBack) { HBITMAP Preview; for (int Ind = 0; Ind <Max, Ind++) { //traitement long CString info; info.format("%02d du traitement total", Ind/Max); InfoCallBack(info.GetBuffer(0), (void*) Preview); //... } }
et dans ta méthode ProgressCallback :
Code : Sélectionner tout - Visualiser dans une fenêtre à part static bool ProgressCallBack (char *Txt, void*hBmp);
maintenant, ta classe B qui lance ObjetA.Traitement(), il te reste plus qu' à lancer ton traitement en passant l'adresse de ta fonction statique en param :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 bool B::ProgressCallback(char *Txt, void *hBmp) { //... Fenetre.Preview = (HBITMAP) hBmp; Fenetre.SetProgressTexte(Txt); Fenetre.Invalidate(); //... }
A ObjetA;
Je sais pas si c'est clair mais bon...
Code : Sélectionner tout - Visualiser dans une fenêtre à part ObjetA.Traitement(..., &B::ProgressCallBack);
Qui va piano va sano...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager