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

C++ Discussion :

Timer et static


Sujet :

C++

  1. #1
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut Timer et static
    Bonjour à tous,

    Dans mon application je cherche à implémenter un timer. Avec la méthode SetTimer, je démarre mon timer en lui spécifiant la callback à appeler à l'expiration du timer.

    Voici une version simplifiée de mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    class CPwet{
    ...
    int m_iValue;
    ...
    void Init();
    static void CALLBACK TimerProc(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime);
    ...
    };
    //----------------------
    void CPwet::Init()
    {
    ....
    SetTimer(NULL,NULL,2000,(TIMERPROC)TimerProc);
    ....
    }
     
    void CALLBACK CPwet::TimerProc(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
    {
    ....
    }
    Le problème que j'ai, c'est que je voudrais accéder à ma variable membre dans le procédure TimerProc sans avoir à la déclarer en statique dans la classe.
    La procédure du timer étant une procédure préformatée (je ne peux pas rajouter dans ses paramètres un pointeur sur la classe), y'a-t-il moyen de récupérer autrement un accès sur cette variable?
    Sinon, avez-vous une autre solution que celle-ci?

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Normalement tu récupères l'identificateur du timer en retour de SetTimer. Avec une table associative, tu peux facilement faire correspondre cet identifiant (que tu récupéreras dans ta callback) avec une instance de classe.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    class CPwet
    {
    public :
     
        void Init()
        {
            UINT_PTR Id = SetTimer(NULL, NULL, 2000, &CPwet::GlobalTimerProc);
            if (Id)
            {
                // On associe l'identificateur du timer à l'instance de Pwet correspondante
                Pwets[Id] = this;
            }
            else
            {
                 // Erreur lors de la création du timer...
            }
        }
     
    private :
     
        void TimerProc()
        {
            // Là tu es dans une fonction membre, tu fais ce que tu veux
        }
     
        static void CALLBACK GlobalTimerProc(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
        {
            // On cherche l'instance de Pwet correspondant à l'identificateur
            std::map<UINT_PTR, CPwet*>::const_iterator It = Pwets.find(idEvent);
            if (It != Pwets.end())
            {
                // Trouvé : on peut utiliser l'instance de Pwet
                CPwet* ThePwet = It->second;
                ThePwet->TimerProc();
            }
            else
            {
                // Problème... identificateur non enregistré
            }
        }
     
        static std::map<UINT_PTR, CPwet*> Pwets;
    };

  3. #3
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Effectivement, ça fonctionne à condition que la déclaration de la map statique ne soit pas dans la classe.

    Merci à toi

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Effectivement, ça fonctionne à condition que la déclaration de la map statique ne soit pas dans la classe.
    Si, c'est sa définition qui ne doit pas l'être.

  5. #5
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Citation Envoyé par Laurent Gomila
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static std::map<UINT_PTR, CPwet*> Pwets;
    La compilation passe, mais il me jette au moment du LINK car il ne trouve pas la map référencée dans la procédure globale du timer. Mais par contre, si la map est déclarée en dehors de la classe, ça ne pose plus de problèmes.

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Une variable membre statique ça ne se définit pas n'importe comment :
    http://cpp.developpez.com/faq/cpp/?p..._static_erreur

  7. #7
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Merci j'ai compris!

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

Discussions similaires

  1. Grosse confusion avec Timers + valeurs Static
    Par temparm dans le forum Débuter
    Réponses: 1
    Dernier message: 17/12/2012, 17h15
  2. [] [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
  3. Timer de précision
    Par guigui dans le forum MFC
    Réponses: 1
    Dernier message: 04/12/2002, 15h21
  4. Timer en µsecondes
    Par Dagobert dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 25/11/2002, 00h59
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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