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 :

Le callback de SetTimer


Sujet :

MFC

  1. #1
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut Le callback de SetTimer
    Salut,

    Je viens de lire dans des vieux posts du forum que la façon la plus "sure" de faire un timer était soit de passer par des threads, soit d'utiliser le CALLBACK de SetTimer (parceque le message WM_TIMER n'assurait pas du tout une execution régluière à haute fréquence )

    Je finirai surement par passer par les threads, mais pour l'instant je avis me contenter du callback... mais comment faire ? OnTimer() était une méthode de ma classe View, mais maintenant c'est une simple fonction qui est appelé.

    Savez-vous comment faire pour accéder à ma View depuis cette fonction (peut-être avec le hWnd passé en parametre) ?

    Merci !

  2. #2
    mat.M
    Invité(e)
    Par défaut
    On n'est pas obligé de passer par une fonction CALLBACK ; une fonction CALLBACK c'est une fonction associée à l'événement WM_TIMER
    En gérant OnTimer() et le code nécessaire cela peut suffire



    En obtenant un pointeur sur MainFrame puis sur le DOC associé CFrameWnd::GetActiveDocument
    et

    void CMyDoc::OnRepaintAllViews()
    {
    POSITION pos = GetFirstViewPosition();
    while (pos != NULL)
    {
    CView* pView = GetNextView(pos);
    pView->UpdateWindow();
    }
    }

  3. #3
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Salut,

    Merci pour tes réponses !

    Mais en fait je ne comprends pas la 1ère remarque ....

    Et sinon par rapport à la récuperation de la View, le problème c'est que ce n'est pas forcément la vue active ... c'est juste une vue particulière (dans mon cas, une fenêtre type "lecteur multimédia" avec des contrôles Play/Stop, ..., et un slider qui avance avec le temps)

    Donc avant j'avais la méthode OnTimer() sur cette vue, et elle faisait avancer le slider, mais maintenant que c'est un CALLBACK, bah je n'ai plus accès au slider (membre de ma classe ViewLecteur)

  4. #4
    mat.M
    Invité(e)
    Par défaut
    Pour la première réponse , il ya 2 possibilités pour répondre à u événement TIMER : soit on place du code dans OnTimer() soit comme apparemment c'est le cas , on déclare une fonction CALLBACK que prend pour référence SetTImer ( sorry j'ai pas été assez précis là dessus


    SetTimer
    The SetTimer function creates a timer with the specified time-out value.

    UINT SetTimer(
    HWND hWnd, // handle of window for timer messages
    UINT nIDEvent, // timer identifier
    UINT uElapse, // time-out value
    TIMERPROC lpTimerFunc // address of timer procedure
    );

    Parameters
    hWnd
    Handle to the window to be associated with the timer. This window must be owned by the calling thread. If this parameter is NULL, no window is associated with the timer and the nIDEvent parameter is ignored.
    nIDEvent
    Specifies a nonzero timer identifier. If the hWnd parameter is NULL, this parameter is ignored.
    uElapse
    Specifies the time-out value, in milliseconds.
    lpTimerFunc
    Pointer to the function to be notified when the time-out value elapses. For more information about the function, see TimerProc.
    If lpTimerFunc is NULL, the system posts a WM_TIMER message to the application queue. The hwnd member of the message'sMSG structure contains the value of the hWnd parameter.




    WM_TIMER
    The WM_TIMER message is posted to the installing thread's message queue when a timer expires. You can process the message by providing a WM_TIMER case in the window procedure. Otherwise, the default window procedure will call the TimerProc callback function specified in the call to the SetTimer function used to install the timer.

    Maintenant je ne pige pas tout : la vue comporte un lecteur multimédia ???


    mais maintenant que c'est un CALLBACK, bah je n'ai plus accès au slider (membre de ma classe ViewLecteur)
    Pourquoi déclarer une f() CALLBACK ??
    Avec OnTimer() ça suffit plus ??

  5. #5
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Voilà, en fait c'est une CFormView qui contient des contrôles type "Windows media player".

    Et justement, si je veux avoir un curseur de lecture qui avance de manière fluide, il me faut un timer précis (déclanché toutes les 10ms exactement) ... et OnTimer() ne l'est pas

    J'ai vu dans des vieux posts que ça serait un peu mieux en utilisant le callback de SetTimer, mais à ce moment j'ai des problèmes puisque ce n'est plus une méthode de ma CFormView ... donc comment accéder à mon curseur de temps pour le faire avancer ?

    J'espère que c'est un peu plus clair, c'est pas évident à expliquer

    Sinon visiblement le timer serait encore plus précis avec des threads, mais c'est pareil... ça ne sera plus une méthode de ma classe....

  6. #6
    Membre habitué Avatar de BertrandA
    Inscrit en
    Août 2003
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 170
    Points : 197
    Points
    197
    Par défaut
    Et justement, si je veux avoir un curseur de lecture qui avance de manière fluide, il me faut un timer précis (déclenché toutes les 10ms exactement) ... et OnTimer() ne l'est pas
    Un timer multimedia sera beaucoup plus précis, de l'ordre de la ms, et c'est typiquement son domaine d'application.
    Voir timeSetEvent(), timeBeginPeriod(), timeKillEvent, ... et leurs amis.

    Pour ce qui est de récupérer la vue active, ça ne devrait pas être un problème : AfxGetMainWnd(), GetActiveView(), ...

  7. #7
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Ah merci... ils ont l'air précis

    Par contre, d'après la MSDN:
    Requirements:
    Windows XP: Included in Windows XP only.
    Header: Declared in Mmsystem.h; include Windows.h.
    mais ca ne veut pas compiler chez moi ....

    et sinon ce n'est pas la vue active que je veux récupérer, mais la CFormView qui contient la barre de temps (celle dans laquelle j'aurai placé le OnTimer si j'avais utilisé cette méthode)... mais la ce n'est plus un problème vu qu'on peut passer des user data au callback ... je vais donc passer un pointeur sur la vue en question

  8. #8
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    En fait, contrairement à ce que dis la MSDN, il faut inclure directement Mmsystem.h, et linker avec Winmm.lib, et tout va bien

    Merci bien, ça fonctionne comme il faut

  9. #9
    mat.M
    Invité(e)
    Par défaut
    Oui tu peux utiliser QueryPerformanceCounter s'il est disponible sur la machine sinon GetCurrentTime ( à vérifier )

  10. #10
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    déclanché toutes les 10ms exactement
    Pas possible, Windows n'est pas temps réel, tu ne peux pas exiger une précision d'1 ms. 10 ms, c'est déjà la précision maximale...
    Ca marchouillera si le système a une faible charge, mais dès qu'il bossera un peu...

  11. #11
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Mais comment sont codés les lecteurs multimédias alors ? J'imagine qu'un timer doit réguler l'avancement de la barre de temps... et pour avoir 30 images secondes, on arrive à un Timer de 0.33ms.

    OK, on s'éloigne un peu des 10ms fatidiques , mais il faut quand même qu'il soit super régulier j'imagine (ça serait dommage qu'une seconde de film dure 0.9 secondes rééles par exemple).

    Comment font-ils ?

  12. #12
    Membre habitué Avatar de BertrandA
    Inscrit en
    Août 2003
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 170
    Points : 197
    Points
    197
    Par défaut
    Pas possible, Windows n'est pas temps réel, tu ne peux pas exiger une précision d'1 ms. 10 ms, c'est déjà la précision maximale...
    C'est certain. On reste tributaire du scheduler et de son timeslice, et en deçà de 10ms, rien n'est garanti.

  13. #13
    Membre habitué Avatar de BertrandA
    Inscrit en
    Août 2003
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 170
    Points : 197
    Points
    197
    Par défaut
    Mais comment sont codés les lecteurs multimédias alors ?
    Avec des timers multimedia. Et le résultat tu le connais : désynchronisation ou reproduction saccadée si une autre application est en train de bouffer le temps CPU ou si la machine n'est pas assez performante.

  14. #14
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    C'est vrai.

    En fait la solution serait peut être d'augmenter la priorité du processus à son lancement, pour éviter tous les problèmes de saccade.
    Comme c'est une appli du type lecteur multimédia, l'utilisateur n'est pas censé faire autre chose en même temps

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

Discussions similaires

  1. Fonction callback
    Par saibe dans le forum Linux
    Réponses: 4
    Dernier message: 19/01/2012, 10h41
  2. [Débutant] fonction CALLBACK
    Par tlt dans le forum MFC
    Réponses: 2
    Dernier message: 29/10/2004, 16h55
  3. Callback
    Par el_diablos dans le forum Langage
    Réponses: 2
    Dernier message: 09/07/2004, 08h48
  4. Fonction callback dans une classe
    Par julian_ross dans le forum MFC
    Réponses: 8
    Dernier message: 02/03/2004, 11h42
  5. [MFC] Un callback dans des MFC ...
    Par elsargento dans le forum MFC
    Réponses: 3
    Dernier message: 18/02/2004, 16h04

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