Timer C++

Bonjour,

Je développe une dll en c++ (builder c++ 6) sur laquelle je fais appel à une méthode chaque 3 minute mais je n'arrive pas à l'appeler voici le code que j'utilise :

void MyMethod()
{
TTimer *Timer1;
Timer1->Interval = 30000;
Timer1->Enabled =true;
Timer1->OnTimer = Afficher; // la compilation se bloque ici

}

void Afficher (String msg)
{

ShowMessage(msg);

}

---------------------------------------------------------
la compilation génère l'erreur suivant: [C++ Erreur] E2034 Impossible de convertir 'void (*)(AnsiString)' en 'void (_fastcall * (_closure )(TObject *))(TObject *)'
-------------------------------------------------------------------------------------------------------

Et Merci d'avance pour votre aide !!

3 réponses

  1. Eh, bien, le compilateur dis tout, non?
    [C++ Erreur] E2034 Impossible de convertir 'void (*)(AnsiString)' en 'void (_fastcall * (_closure )(TObject *))(TObject *)'

    Ca signifie que tu fais une conversion invalide d'un pointeur sur fonction à un autre type de pointeur sur fonction...
    Tu convertis un type void (_fastcall * (_closure )(TObject *))(TObject *)
    en void (*)(AnsiString);

    Si tu souhaites absolument effectuer la conversion tu peux toujours :
    Timer1->OnTimer = (void (_fastcall * (_closure )(TObject *))(TObject *)
    en void (*)(AnsiString)) Afficher;
    


    Je ne sais pas si ça fonctionnera, mais tu peux essayer.
    0
    1. Merci pour votre réponse,

      Je ne sais pas comment la faire, si vous pouvez m'aider ça sera bien !

      Sinon, si vous avez une idée comment faire pour appeler une méthode sans passer par le Timer, je serais reconnaissant :)!

      Merci infiniment,
      0
      1. Bon, alors voilà... une idée pour appeler une méthode sans passer par le timer...bon d'accord.

        Alors, j'ai bien l'impression que ta méthode utilise ailleurs un callback (https://fr.wikipedia.org/wiki/Fonction_de_rappel Dans ce genre de cas, on doit utiliser un modèle de fonction spécifique. Ici, dans ton cas, d'après ton compilateur, le modèle semble être :
        void (_fastcall * (_closure )(TObject *))(TObject *)
        


        mais toi, tu n'utilises pas ce modèle, alors que ça devrait être le cas
        tu devrais donc changer ce code :
        void Afficher (String msg)
        {
        
        ShowMessage(msg);
        
        } 
        


        par un autre que je serais bien en peine de te dire, puisque je n'utilise pas la librairie VCL.

        Mais le prototype devrait correspondre à (_fastcall * (_closure )(TObject *))(TObject *)

        Ceci dit, il y a une alternative à cela, qui serais de créer un thread (tutoriel basique : http://www.siteduzero.com/tutoriel-3-3291-les-threads-et-les-mutex.html). Alors, tu pourrais, à l'intérieur de ton thread, exécuter ton «ShowMessage(msg);» à chaque 3 minutes, en utilisant par exemple un «Sleep(30000);» de la librairie <windows.h>.
        0