Timer C++

Wize seeker Messages postés 13 Date d'inscription   Statut Membre Dernière intervention   -  
.N Messages postés 25 Date d'inscription   Statut Membre Dernière intervention   -
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 !!
A voir également:

3 réponses

.N Messages postés 25 Date d'inscription   Statut Membre Dernière intervention   570
 
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
Wize seeker Messages postés 13 Date d'inscription   Statut Membre Dernière intervention  
 
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
.N Messages postés 25 Date d'inscription   Statut Membre Dernière intervention   570
 
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