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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre chevronn�
    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
    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 chevronn�
    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
    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 chevronn�
    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
    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 exp�riment� Avatar de BertrandA
    Inscrit en
    Ao�t 2003
    Messages
    170
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2003
    Messages : 170
    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 chevronn�
    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
    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 chevronn�
    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
    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 confirm�

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

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    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 chevronn�
    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
    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 exp�riment� Avatar de BertrandA
    Inscrit en
    Ao�t 2003
    Messages
    170
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2003
    Messages : 170
    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 exp�riment� Avatar de BertrandA
    Inscrit en
    Ao�t 2003
    Messages
    170
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2003
    Messages : 170
    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 chevronn�
    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
    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