TIMER EN C

felixboxer Messages postés 28 Date d'inscription dimanche 17 mars 2002 Statut Membre Dernière intervention 4 mars 2003 - 25 nov. 2002 à 23:01
karmablow Messages postés 1 Date d'inscription mercredi 31 décembre 2003 Statut Membre Dernière intervention 1 décembre 2006 - 1 déc. 2006 à 22:25
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/10137-timer-en-c

karmablow Messages postés 1 Date d'inscription mercredi 31 décembre 2003 Statut Membre Dernière intervention 1 décembre 2006
1 déc. 2006 à 22:25
Simple mais pratique ce genre de code :)
Merci
Yeeehhoo Messages postés 5 Date d'inscription mardi 25 juillet 2006 Statut Membre Dernière intervention 10 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és 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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és 5 Date d'inscription mardi 25 juillet 2006 Statut Membre Dernière intervention 10 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és 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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
}

// 1 appel par secone
timID = SetTimer(0, 0, 1000, timFunc);

// stop le timer
KillTimer(0, timID);
Yeeehhoo Messages postés 5 Date d'inscription mardi 25 juillet 2006 Statut Membre Dernière intervention 10 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és 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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és 5 Date d'inscription mardi 25 juillet 2006 Statut Membre Dernière intervention 10 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és 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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és 5 Date d'inscription mardi 25 juillet 2006 Statut Membre Dernière intervention 10 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és 1 Date d'inscription lundi 2 février 2004 Statut Membre Dernière intervention 20 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és 1 Date d'inscription dimanche 14 septembre 2003 Statut Membre Dernière intervention 26 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és 455 Date d'inscription mercredi 6 mars 2002 Statut Membre Dernière intervention 18 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és 1 Date d'inscription dimanche 24 novembre 2002 Statut Membre Dernière intervention 27 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és 6 Date d'inscription jeudi 14 novembre 2002 Statut Membre Dernière intervention 27 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és 202 Date d'inscription vendredi 6 juillet 2001 Statut Membre Dernière intervention 31 octobre 2007
26 nov. 2002 à 17:08
Sardinoma si tu utilise dev-c++ remplace
#include<conio.h>
par
#include<conio.c>
Sardinoman Messages postés 31 Date d'inscription vendredi 20 septembre 2002 Statut Membre Derniè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és 28 Date d'inscription dimanche 17 mars 2002 Statut Membre Dernière intervention 4 mars 2003
25 nov. 2002 à 23:01
ouer c pas mal... =)
Rejoignez-nous