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

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Points : 54
    Points
    54
    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 averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 376
    Points
    376
    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 du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 59
    Points : 54
    Points
    54
    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 du Club
    Inscrit en
    Juillet 2005
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Points : 54
    Points
    54
    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 habitué
    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
    Points : 179
    Points
    179
    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 du Club
    Inscrit en
    Juillet 2005
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 60
    Points : 54
    Points
    54
    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