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 -
.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 !!
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:
- Timer C++
- Shutdown timer - Télécharger - Personnalisation
- Multi timer - Télécharger - Bureautique
- Marxio timer - Télécharger - Divers Utilitaires
- Vista shutdown timer - Télécharger - Optimisation
- Simple shutdown timer - Télécharger - Divers Utilitaires
3 réponses
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 :
Je ne sais pas si ça fonctionnera, mais tu peux essayer.
[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.
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,
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,
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 :
mais toi, tu n'utilises pas ce modèle, alors que ça devrait être le cas
tu devrais donc changer ce code :
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>.
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>.