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++Builder Discussion :

Fonction de callback


Sujet :

C++Builder

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Inscrit en
    Juillet 2005
    Messages
    60
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Par d�faut Fonction de callback
    Bonjour,

    J'ai r�alis� un programme de capture vid�o (qui fonctionne correctement), utilisant l'instruction API AVISaveV :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    AVISaveV(vid_and_wavFileName.c_str(), 0, 0, 1, &aviStreamFinal, 0);
    Comme la sauvegarde du fichier vid�o peut �tre longue (fichiers de plusieurs centaines de Mo), je voudrais ajouter une barre de progression pour faire patienter l'utilisateur.
    Pour ce faire, il me faut donc ajouter une fonction de callback durant l'execution de cette instruction AVI.
    Voici le code que j'utilise :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    AVISaveV(vid_and_wavFileName.c_str(), 0, (AVISAVECALLBACK)SaveCallback(nPercent), 1, &aviStreamFinal, 0);   
     
    LONG __stdcall TForm1::SaveCallback(int nPercent)     
    {
      Form2->ProgressBar1->Position = nPercent;
      Application->ProcessMessages();
      return(AVIERR_OK);
    }
    Malheureusement, ce code ne fonctionne pas (ProgressBar inerte) : Selon la documentation Microsoft, "the nPercent parameter specifies the percentage of the file saved".
    Quelqu'un a-t-il une id�e concernant l'erreur que je fais ?

    Une recherche sur Internet montre qu'au moins une dizaine de personnes ont but� sur cette difficult�, mais je n'y ai trouv� aucune solution propos�e.

  2. #2
    Membre chevronn�
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Par d�faut
    Je ne connais pas cette API. Mais pour moi, cette instruction:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    AVISaveV(vid_and_wavFileName.c_str(), 0, (AVISAVECALLBACK)SaveCallback(nPercent),
    est tr�s douteuse. C'est en effet le r�sultat de ta fonction SaveCallBack que tu transmets � AVISaveV et non pas son adresse.

    Je verrais plut�t:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    AVISaveV(vid_and_wavFileName.c_str(), 0, (AVISAVECALLBACK)SaveCallback,
    C'est AVISaveV qui va se charger d'appeler ta fonction avec le param�tre nPercent

  3. #3
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    59
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 59
    Par d�faut
    as tu le typage de la m�thode ?
    la m�thode save..... est ce un pointeur sur fonction ? sinon place &Save...

  4. #4
    Membre confirm�
    Inscrit en
    Juillet 2005
    Messages
    60
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Par d�faut
    C'est en effet le r�sultat de ta fonction SaveCallBack que tu transmets � AVISaveV et non pas son adresse.
    C'est aussi l'impression que j'aie.
    Le probl�me est que quand je mets "(AVISAVECALLBACK)SaveCallback,..." j'ai l'erreur suivante :
    E2316 '__stdcall TForm1::SaveCallback(int)' n'est pas un membre de 'TForm1'
    En effet, la d�finition de la fonction reste :
    LONG __stdcall TForm1::SaveCallback(int nPercent)
    {
    ...
    }


    la m�thode save..... est ce un pointeur sur fonction ?
    Oui, c'est un pointeur sur fonction : Voir ici http://msdn2.microsoft.com/en-us/library/ms706598.aspx

    J'ai �galement essay� "&SaveCallback,..." et l� c'est encore pire :
    E2034 Impossible de convertir 'long *' en 'int (__stdcall *)(int)'
    E2342 Mauvaise correspondance de type dans le param�tre 'lpfnCallback' ('int (__stdcall *)(int)' d�sir�, 'long *' obtenu)
    E2316 '__stdcall TForm1::SaveCallback(int)' n'est pas un membre de 'TForm1'


    Je pense qu'il faut utiliser la premi�re methode, mais comment se d�barasser de l'erreur ???

  5. #5
    Membre �prouv�
    Profil pro
    Inscrit en
    Ao�t 2006
    Messages
    190
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2006
    Messages : 190
    Par d�faut
    Bonsoir,

    Et si tu fais en sorte que ton call back ne soit pas une fonction d'un objet?

    Je crois qu'une fonction callback d'un objet est d�sign�e par un lot de deux pointeur, le premier pour la classe, et le second pour la m�thode de la classe.
    Peut �tre que dans ton cas, la m�thode AVISaveV re�oit en guise de callback un lien vers ta classe, ce qui pourrait expliquer que cela compile mais ne fonctionne pas.

    Je suis d�sol� mais je ne suis pas en mesure de tester ma supposition.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    LONG __stdcall SaveCallBack(int nPercent){
      Form2->ProgressBar1->Position = nPercent;
      Application->ProcessMessages();
      return(AVIERR_OK);  
    }
    Cordialement,
    Benjamin

  6. #6
    Membre confirm�
    Inscrit en
    Juillet 2005
    Messages
    60
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Par d�faut
    LONG __stdcall SaveCallBack(int nPercent){
    ...
    }
    Excellent : �a marche!

    Merci beaucoup � vous trois d'avoir �clair� ma lanterne.

    AL

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Utilisation d'une m�me variable dans diff�rents fonctions de Callback
    Par houjuventini dans le forum Interfaces Graphiques
    R�ponses: 1
    Dernier message: 16/11/2007, 08h58
  2. Conflit de fonctions de callback GLUT
    Par CKaiser dans le forum GLUT
    R�ponses: 4
    Dernier message: 24/06/2007, 21h07
  3. Fonction et Callback
    Par biquet dans le forum Interfaces Graphiques
    R�ponses: 17
    Dernier message: 13/04/2007, 15h01
  4. probl�me avec un appel de fonction de callback de C++ vers C#
    Par surfurax dans le forum Framework .NET
    R�ponses: 1
    Dernier message: 29/01/2007, 10h09
  5. R�ponses: 4
    Dernier message: 14/09/2006, 12h25

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