karmablow
Messages postés1Date d'inscriptionmercredi 31 décembre 2003StatutMembreDernière intervention 1 décembre 2006 1 déc. 2006 à 22:25
Simple mais pratique ce genre de code :)
Merci
Yeeehhoo
Messages postés5Date d'inscriptionmardi 25 juillet 2006StatutMembreDernière intervention10 août 2006 10 août 2006 à 23:14
Absolument, je ne veut surtout pas associer de timer a une fenètre.
Ma fenètre sert à récupérer les valeurs que l'utilisateur choisit (ce sont des dates et des périodes uniquement, enregistrées dans des structures COleDateTime et COleDateTimeSpan).
J'utilise ici deux type de classe. La première est celle de la fenètre (que j'apelerais classe F) et la seconde est celle que j'ai créé (classe M ). La classe M contient toute les informations dont j'ai besoin pour faire les calculs.
Dans ma classe F, je fait appel à une fonction de la fenètre (que j'appelerais fonction_clique_OK() ).
Je déclare dans ma classe F une instance de M (M_instance) en tant que variable globale.
fonction_clique_OK() fait appel aux fonction de M_instance pour enregistrer les valeurs de la fenètre (grace à pleins de GetDlgItem(IDC_blabla,M_instance.blabla) ).
Je souhaite intégrer un timer dans la classe M de façon à pouvoir réaliser des operation telles que:
M_instance::startTimer()
M_instance::stopTimer()
ou tout autre action similaire à un timer classique.
Ainsi, lorsque la fenètre est fermé, les calculs liés à la classe continuent sans problème.
CEPENDANT, je suis en train de me demander si le M_instance que j'ai déclaré en tant que variable globale au début de la classe F ne va pas être détruit lui aussi lorsque ma fenètre va se fermer.
J'espère que j'ai été plus clair.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 10 août 2006 à 22:11
Tu disais au début (ou alors j'ai mal compris) ne pas vouloir associer de timer à une fenêtre.
Une fonction callback d'une classe doit être déclarée 'static'.
Il faut stopper le timer juste avant la destruction de la fenetre.
Yeeehhoo
Messages postés5Date d'inscriptionmardi 25 juillet 2006StatutMembreDernière intervention10 août 2006 10 août 2006 à 21:41
Je pense que ta fonction devrait résoudre mon problème, mais j'ai quand même quelques intérogations.
->Dans ta fonction timFunc, tu fait appel à HWND qui est un handler de fenêtre! Etant donné que je veu que mes fenètres puissent être détruites sans que cela ait de conséquences, j'ai peur pour ce qui va rester du handler en question et surtout pour le timer associé.
->Je ne peu pas intégrer la fonction "CALLBACK " dans une autre fonction ou dans une classe (sinon erreur C2601).
J'ai en effet créé une classe qui contient toute les informations necessaires aux calculs. Les informations sont récupérées depuis une fenètre .
Dans cette classe j'ai également définit des fonctions qui réalisent des calculs sur ces variables.
Je souhaiter intégrer un timer à cette classe (celui ci utilisant les variables e la classe pour gérer l'intervale de timing et la condition d'arret).
->Je ne vois pas a quel endroit je doit définir timID(=SetTimer(...)). J'ai pleins de problèmes avec ça car CALLBACK ne peut être défini à l'intérieur d'une fonction (sinon erreur C2601!) et il faut pourtant que je définisse timID au même endroit que CALLBACK
Un petit exemple de main() qui utilise cette fonction serait très aprécié et m'aiderait à éclaircir ce sac de noeud :)
Merci ;)
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 10 août 2006 à 18:08
Par exemple:
DWORD timID;
VOID CALLBACK timFunc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
// ce que tu veux ici
}
Yeeehhoo
Messages postés5Date d'inscriptionmardi 25 juillet 2006StatutMembreDernière intervention10 août 2006 10 août 2006 à 17:52
J'utilise des MFC, mais aussi des API windows. En fait je travaille sous Visual Studio.net 2003 et j'ai lors de la création de l'application ,j'ai choisit de gérer des MFC avec l'AppWizzard.
Désolé si j'explique mal mon problème. Je suis en stage en ce moment (ecole ingé en info, 1ère année), et je dois me démerder pour apprendre toutes ces choses, d'ou parfois mon manque de clarté et mes galères successive pour m'en sortir ;)
Si tu as une solution pour gérer avec l'API un timer indépendant aux fenètres, ça m'interesse énormément. ^^
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 10 août 2006 à 14:23
J'ai abandonné MFC et ses contraintes depuis fort longtemps au profit de la liberté de l'API, je ne saurai donc pas plus t'aider.
Yeeehhoo
Messages postés5Date d'inscriptionmardi 25 juillet 2006StatutMembreDernière intervention10 août 2006 10 août 2006 à 13:11
Mais comment faire alors pour faire appel à la fonction OnTimer() associé?
Celle-ci est une fonction des classes fenètres mais surtout, c'est une fonction privée, donc pas "appelable" depuis un pointeur sur la fenètre en question.
Les fenètres sont là pour parametrer les calculs de mon application. Celles-ci disparaissent lorsque le paramétrage est terminé, mais le calcul, lui contiue et l'utilisateur a la main pour faire d'autres calculs.
La fonction Sleep risque de me poser problème en tout cas si elle est bloquante. Il faut par la suite que je gère toute mes fénètres (et leurs calculs associés) avec des Thread, donc si fonction bloquante il y a, gros problème je vais avoir ;)
Merci en tout cas pour ton commentaire. Je vais retester cette maudite fonction SetTimer (misère de misère) :(
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 10 août 2006 à 09:16
Absolument NON, SetTimer() prend l'adresse d'une fonction callback en dernier param et se passera fort bien de tout HWND.
Sleep() en boucle while est bloquant et n'a donc rien à faire dans une application graphique.
Yeeehhoo
Messages postés5Date d'inscriptionmardi 25 juillet 2006StatutMembreDernière intervention10 août 2006 10 août 2006 à 03:40
Le code en lui même ne m'a pas servi vraiment, mais je tient quand même a remercier Kriten!!
Je suis en train de déveloper une application en MFC, et ça fait trois jours complet que je me prenais la tete pour réussir à réaliser un timer particulier.
En effet, il fallait que celui ci soit indépendant de mes fenêtres, ce qui n'es pas le cas de toutes les fonctions "SetTimer" ou "Timer" que j'ai pu trouver (faisait référence systématiquement à l'identifiant de la fenètre, maudites soient elles!!!).
Il suffisait tout simplement d'utiliser la fonction "Sleep" dans une boucle while (ou for) pour donner un code de la forme:
while(CONDITION)
{
Sleep(TEMPS DE TIMER);
ACTION A REPETER A CHAQUE ITERATION;
}
Sans doute une erreur de débutant, mais je me dit que si je me suis pris la tete dessus, peut être d'autres peuvent trouver mon commentaire utile!
Merci Kryten, tchuuuuuuuuuuuusss!! ;)
TIMALE75
Messages postés1Date d'inscriptionlundi 2 février 2004StatutMembreDernière intervention20 décembre 2005 20 déc. 2005 à 17:52
Un seul mot "BRAVO"
C'est tout simple mais il fallait y penser. Je cherchais un petit timer pour décaler des actions et je ne trouvais pas quelque chose de simple. Ton programme me simplifie la vie.
Merci et encore "BRAVO"
cs_kelakhai
Messages postés1Date d'inscriptiondimanche 14 septembre 2003StatutMembreDernière intervention26 septembre 2003 26 sept. 2003 à 11:11
Mais ... Moi ce que j'aurais envie de trouver c'est un timer qui se base sur l'horloge interne. Complètement paramètrable et qui fonctionnerai en tâche de fond.
Quelqu'un a-t-il déja réussi à mettre ça en oeuvre avec Dev-C++ ?
cmarsc
Messages postés455Date d'inscriptionmercredi 6 mars 2002StatutMembreDernière intervention18 décembre 2003 2 déc. 2002 à 11:07
salut,
toutes les déclarations des variables doivent impérativement être positionnées avant toutes affectations de variables en C, en C++ c'est plus souple par exemple il est écrit :
int temps, inter;
printf("Entrez le nombre de minutes:
"); ...
puis
time_t heure_depart; ...
cette disposition peut provoquer des messages d'erreurs
de plus on peut utiliser getch() <conio.h> au lieu de getchar() (plus pratique)
inter-=1; peut être remplacé par inter-- ou --inter;
il domage que le compte à rebours ne se fasse qu'en secondes et non en HEURES MINUTES ET SECONDES
PS : Dax c'est un code simple facile à mettre en C++
remplacer printf par cout scanf par cin C tout simple NON ? ;-)
Kryten
Messages postés1Date d'inscriptiondimanche 24 novembre 2002StatutMembreDernière intervention27 novembre 2002 27 nov. 2002 à 14:58
dsl je ne fais pas de C++ pour le moment je fait ke du C
mais de toute facon moi je compile ac borland C++ donc je pense que le code en C++ ne doi pas etre trop diferent
(dites moi si jai tor)
cs_Dax
Messages postés6Date d'inscriptionjeudi 14 novembre 2002StatutMembreDernière intervention27 novembre 2002 27 nov. 2002 à 14:47
T as po envie de me la faire en c++ mdrr (merci d avance :)
cs_Thaeron
Messages postés202Date d'inscriptionvendredi 6 juillet 2001StatutMembreDernière intervention31 octobre 2007 26 nov. 2002 à 17:08
Sardinoma si tu utilise dev-c++ remplace
#include<conio.h>
par
#include<conio.c>
Sardinoman
Messages postés31Date d'inscriptionvendredi 20 septembre 2002StatutMembreDernière intervention 5 avril 2003 26 nov. 2002 à 13:42
'clrscr' : undeclared identifier
Faut peut etre une library ou je sais pa mais ca me balance ca
felixboxer
Messages postés28Date d'inscriptiondimanche 17 mars 2002StatutMembreDernière intervention 4 mars 2003 25 nov. 2002 à 23:01
1 déc. 2006 à 22:25
Merci
10 août 2006 à 23:14
Ma fenètre sert à récupérer les valeurs que l'utilisateur choisit (ce sont des dates et des périodes uniquement, enregistrées dans des structures COleDateTime et COleDateTimeSpan).
J'utilise ici deux type de classe. La première est celle de la fenètre (que j'apelerais classe F) et la seconde est celle que j'ai créé (classe M ). La classe M contient toute les informations dont j'ai besoin pour faire les calculs.
Dans ma classe F, je fait appel à une fonction de la fenètre (que j'appelerais fonction_clique_OK() ).
Je déclare dans ma classe F une instance de M (M_instance) en tant que variable globale.
fonction_clique_OK() fait appel aux fonction de M_instance pour enregistrer les valeurs de la fenètre (grace à pleins de GetDlgItem(IDC_blabla,M_instance.blabla) ).
Je souhaite intégrer un timer dans la classe M de façon à pouvoir réaliser des operation telles que:
M_instance::startTimer()
M_instance::stopTimer()
ou tout autre action similaire à un timer classique.
Ainsi, lorsque la fenètre est fermé, les calculs liés à la classe continuent sans problème.
CEPENDANT, je suis en train de me demander si le M_instance que j'ai déclaré en tant que variable globale au début de la classe F ne va pas être détruit lui aussi lorsque ma fenètre va se fermer.
J'espère que j'ai été plus clair.
10 août 2006 à 22:11
Une fonction callback d'une classe doit être déclarée 'static'.
Il faut stopper le timer juste avant la destruction de la fenetre.
10 août 2006 à 21:41
->Dans ta fonction timFunc, tu fait appel à HWND qui est un handler de fenêtre! Etant donné que je veu que mes fenètres puissent être détruites sans que cela ait de conséquences, j'ai peur pour ce qui va rester du handler en question et surtout pour le timer associé.
->Je ne peu pas intégrer la fonction "CALLBACK " dans une autre fonction ou dans une classe (sinon erreur C2601).
J'ai en effet créé une classe qui contient toute les informations necessaires aux calculs. Les informations sont récupérées depuis une fenètre .
Dans cette classe j'ai également définit des fonctions qui réalisent des calculs sur ces variables.
Je souhaiter intégrer un timer à cette classe (celui ci utilisant les variables e la classe pour gérer l'intervale de timing et la condition d'arret).
->Je ne vois pas a quel endroit je doit définir timID(=SetTimer(...)). J'ai pleins de problèmes avec ça car CALLBACK ne peut être défini à l'intérieur d'une fonction (sinon erreur C2601!) et il faut pourtant que je définisse timID au même endroit que CALLBACK
Un petit exemple de main() qui utilise cette fonction serait très aprécié et m'aiderait à éclaircir ce sac de noeud :)
Merci ;)
10 août 2006 à 18:08
DWORD timID;
VOID CALLBACK timFunc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
// ce que tu veux ici
}
// 1 appel par secone
timID = SetTimer(0, 0, 1000, timFunc);
// stop le timer
KillTimer(0, timID);
10 août 2006 à 17:52
Désolé si j'explique mal mon problème. Je suis en stage en ce moment (ecole ingé en info, 1ère année), et je dois me démerder pour apprendre toutes ces choses, d'ou parfois mon manque de clarté et mes galères successive pour m'en sortir ;)
Si tu as une solution pour gérer avec l'API un timer indépendant aux fenètres, ça m'interesse énormément. ^^
10 août 2006 à 14:23
10 août 2006 à 13:11
Celle-ci est une fonction des classes fenètres mais surtout, c'est une fonction privée, donc pas "appelable" depuis un pointeur sur la fenètre en question.
Les fenètres sont là pour parametrer les calculs de mon application. Celles-ci disparaissent lorsque le paramétrage est terminé, mais le calcul, lui contiue et l'utilisateur a la main pour faire d'autres calculs.
La fonction Sleep risque de me poser problème en tout cas si elle est bloquante. Il faut par la suite que je gère toute mes fénètres (et leurs calculs associés) avec des Thread, donc si fonction bloquante il y a, gros problème je vais avoir ;)
Merci en tout cas pour ton commentaire. Je vais retester cette maudite fonction SetTimer (misère de misère) :(
10 août 2006 à 09:16
Sleep() en boucle while est bloquant et n'a donc rien à faire dans une application graphique.
10 août 2006 à 03:40
Je suis en train de déveloper une application en MFC, et ça fait trois jours complet que je me prenais la tete pour réussir à réaliser un timer particulier.
En effet, il fallait que celui ci soit indépendant de mes fenêtres, ce qui n'es pas le cas de toutes les fonctions "SetTimer" ou "Timer" que j'ai pu trouver (faisait référence systématiquement à l'identifiant de la fenètre, maudites soient elles!!!).
Il suffisait tout simplement d'utiliser la fonction "Sleep" dans une boucle while (ou for) pour donner un code de la forme:
while(CONDITION)
{
Sleep(TEMPS DE TIMER);
ACTION A REPETER A CHAQUE ITERATION;
}
Sans doute une erreur de débutant, mais je me dit que si je me suis pris la tete dessus, peut être d'autres peuvent trouver mon commentaire utile!
Merci Kryten, tchuuuuuuuuuuuusss!! ;)
20 déc. 2005 à 17:52
C'est tout simple mais il fallait y penser. Je cherchais un petit timer pour décaler des actions et je ne trouvais pas quelque chose de simple. Ton programme me simplifie la vie.
Merci et encore "BRAVO"
26 sept. 2003 à 11:11
Quelqu'un a-t-il déja réussi à mettre ça en oeuvre avec Dev-C++ ?
2 déc. 2002 à 11:07
toutes les déclarations des variables doivent impérativement être positionnées avant toutes affectations de variables en C, en C++ c'est plus souple par exemple il est écrit :
int temps, inter;
printf("Entrez le nombre de minutes:
"); ...
puis
time_t heure_depart; ...
cette disposition peut provoquer des messages d'erreurs
de plus on peut utiliser getch() <conio.h> au lieu de getchar() (plus pratique)
inter-=1; peut être remplacé par inter-- ou --inter;
il domage que le compte à rebours ne se fasse qu'en secondes et non en HEURES MINUTES ET SECONDES
PS : Dax c'est un code simple facile à mettre en C++
remplacer printf par cout scanf par cin C tout simple NON ? ;-)
27 nov. 2002 à 14:58
mais de toute facon moi je compile ac borland C++ donc je pense que le code en C++ ne doi pas etre trop diferent
(dites moi si jai tor)
27 nov. 2002 à 14:47
26 nov. 2002 à 17:08
#include<conio.h>
par
#include<conio.c>
26 nov. 2002 à 13:42
Faut peut etre une library ou je sais pa mais ca me balance ca
25 nov. 2002 à 23:01