IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

Timer


Sujet :

MFC

  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Par défaut Timer
    Bonjour,

    Je voudrais que mon application lance une procédure toutes les 100ms précise.
    J'ai mis ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    timeSetEvent(100,0,CallBackTimer,0,TIME_PERIODIC);
    Dans la procédure CallBackTimer, j'enregistre des données récupérer en mémoire vers un fichier. La première fonction de ma procédure CallBackTimer est :Et J'enregistre dans le fichier Heure, et je m'aperçois que le temps entre les différentes données Heure enregistrées n'est pas 100ms, mais un coup 93ms, un autre coup 110ms.....etc....
    Ce n'est donc pas trés régulier.

    Comment peut-on faire pour appeler une procédure toutes les 100ms réelles ?

    Merci d'avance
    Fred

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 77
    Par défaut
    pour être homogène, il vaudrait mieux appeler timeGetTime ou timeGetSystemTime pour vérifier la précision du timer.

    Windows sous toutes ses formes n'est pas un OS temps réel.
    En gros, le scheduler accodre des tranches de temps à chauqe tache et lorsqu'une tranche de temps est épuisée ou que le process/thread passe en "attente", il fait un changement de tache et à ce moment regarde les sémaphores, mutex et timer et autres pour voir sii quelqu'un a besoin d'être réveillé. Comme en plus ca tient compte des priorités relatives des tâches, il y a une certaine fluctuation....

    Il me semble qu'il y a des solutions qui trainent dans la nature

  3. #3
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 46
    Par défaut
    Je me trompe peut-être (surement même ), mais est-ce que augmenter la priorité du thread n'augmenterait pas la précision ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 77
    Par défaut
    A priori, oui, mais de toute facon, la latence de Wxx est assez grande. En plus les choix de priorité sont assez restreints, avec HIGH_PRIORITY_CLASS, on arrive à la priorité du task manager, avec REALTIME_PRIORITY_CLASS, on prend vraiment des risques....

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Par défaut
    Bonjour,

    Merci pour vos aides.
    Encore 1 question :
    Comment fait-on pour obtenir des hh:mm:ss:ms d'après ce que retourne timeGetTime() ?

    Merci
    Fred

  6. #6
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    salut, le plus simple est d'utiliser GetSystemTime pour avoir une structure

  7. #7
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Par défaut
    oui, mais ce n'est pas précis pour ce que je cherche.

  8. #8
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    la seule facon de l'utiliser est de faire une différence avec un autre appel de timeGetTime()
    si tu cherches encore plus de précisions, tu peux te tourner vers QueryPerformanceCounter et QueryPerformanceFrequency

  9. #9
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Par défaut
    Est-il possible d'ajouter le résultat de timeGetTime() dans GetSystemTime() ?

    Cad, je déclare au départ une variable long iStartTime = GetSystemTime, qui va me donner l'heure de départ, et ensuite je peux incrémenter cette variable avec le contenu de timeGetTime() pour avoir les hh:mm:ss:ms avec la précision de timeGetTime().
    Est-ce que c'est possible ?
    Si oui, comment puis-je faire STP (car je débute avec Visual C++, donc tout est nouveau pour moi) ?

    Merci

  10. #10
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    tu veux calculer le nombre de ms, sec, etc ... entre deux appels ? c'est ca ?

    faudrait faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	DWORD start = timeGetTime();
     
    // ... truc à mesurer ...
     
    	DWORD end = timeGetTime();
     
    	int ms = (end-start) % 1000;
    	int ss = ((end-start) -  (end-start) % 1000)/1000;
    	// etc ...

  11. #11
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    sauf qu'il faudrait revoir mes formules mathématiques ... ca commence à dater

  12. #12
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Par défaut
    je me suis débrouillée.
    En fait je décompose mes varaibles (heure, ms,s...) de GetSystemTime(), et j'incémente les ms avec le résultat de timeGetTime(), et après je fais mes analyses sur ms, si ms > 1000 alors j'incrémente les secondes, et ainsi de suite......
    Ce n'est peut-être pas une très bonne programmation, mais ca marche très bien.

    Merci pour ton aide
    Fred

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment faire un Timer de fonction PORTABLE ?
    Par dieuP1guin dans le forum C
    Réponses: 3
    Dernier message: 04/07/2003, 10h44
  2. [horloge] conflit caractère / timer
    Par JeanJean dans le forum C
    Réponses: 10
    Dernier message: 09/05/2003, 23h47
  3. [] [Réseau] Anti-timer, anti-idle
    Par clonevince dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 15/01/2003, 22h19
  4. Timer de précision
    Par guigui dans le forum MFC
    Réponses: 1
    Dernier message: 04/12/2002, 15h21
  5. Timer en µsecondes
    Par Dagobert dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 25/11/2002, 00h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo