Timer C++

Fermé
Wize seeker Messages postés 13 Date d'inscription samedi 19 décembre 2009 Statut Membre Dernière intervention 14 mars 2011 - Modifié par Wize seeker le 13/03/2011 à 18:56
.N Messages postés 25 Date d'inscription samedi 12 mars 2011 Statut Membre Dernière intervention 17 mars 2011 - 14 mars 2011 à 02:17
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 samedi 12 mars 2011 Statut Membre Dernière intervention 17 mars 2011 547
13 mars 2011 à 21:40
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 samedi 19 décembre 2009 Statut Membre Dernière intervention 14 mars 2011
Modifié par Wize seeker le 13/03/2011 à 22:12
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 samedi 12 mars 2011 Statut Membre Dernière intervention 17 mars 2011 547
14 mars 2011 à 02:17
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