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 MFC erreur de LNK


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 126
    Par défaut Timer MFC erreur de LNK
    Bonjour à tous!

    voila j'ai un problème au niveau d'un timer que j'ai créé de la manière suivante
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
     
    #include<windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include "Timer.h"
     
    // Timer dialog
     
    /*static*/void Timer::OnStartTimer() 
    {
     
       UINT_PTR m_nTimer;
       m_nTimer = SetTimer(1, 10, 0);
    }
     
    /*static*/void Timer::OnStopTimer() 
    {
       UINT_PTR m_nTimer;
       KillTimer(m_nTimer);   
    }
     
     
    /*static*/ void Timer::OnTimer(UINT IdTimer) 
    {
     
    	int PedalState;
    	PedalState=0;
     
    	unsigned char Authmov[1]={140}; // get etat command
    	unsigned char NoAuthmov[1]={141}; // get etat command
     
    	CCom::ClosePortCom();
    	CCom::InitPortCom();
     
     
    	if(PedalState = 0)
    	{
    		WriteFile(hcom,Authmov, 1, &m, NULL);
    		CCom::ReadBuffer();
     
    		if ((data[1]=1)&&(data[0]=140))
    		{
    			OnStopTimer();
    			OnStartTimer(); 
     
    		}
    		else
    		{
     
    			OnStopTimer();
    			OnStartTimer(); 
    		}
     
    	}
    	else
    	{
    		WriteFile(hcom,NoAuthmov, 1, &m, NULL);
     
    		if ((data[1] = 1) && (data[0]=141))
    		{
    			OnStopTimer();
    			OnStartTimer(); 
     
    		}
    		else
    		{
     
     
    			OnStopTimer();
    			OnStartTimer(); 
    		}
    	}
     
    }
    J'ai essayé de suivre les indications du faq de farscape mais j'ai les erreurs suivantes:
    error LNK 2019:unresolved external symbol "public:static unisgned int_cdecl Timer::SetTimer...
    error LNK 2019:unresolved external symbol "public:static unisgned int_cdecl Timer::killTimer...

    J'ai cherché dans les forums mais je ne comprends pas vraiment ...
    Pouvez vous me donner un coup de main?

    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    normal la méthode SetTimer de la faq fait partie de la classe CWnd...
    sinon il faut passer par l'api Win32 mais bon je ne te le conseil pas trop...

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 126
    Par défaut
    Merci pour ta réponse !

    Il suffit donc je déclare les fonctions dans mon .h de la manière suivante?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    CWnd::SetTimer
    UINT SetTimer( 
    UINT nIDEvent,  // numéro du timer à partir de 1 
    UINT nElapse,    // temps ecoulé entre 2 appels en ms.
    void (CALLBACK EXPORT* lpfnTimer)( 
    HWND, UINT, UINT, DWORD) ); // fonction callback.
     
     
    CWnd::KillTimer
    BOOL KillTimer( 
    int nIDEvent ); // numéro du Timer
    cependant je suis débutante en C++ et ma fonction OnTimer est static il faut donc que SetTimer et KillTimer le soient aussi ... comment puis je faire?

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 126
    Par défaut
    Si je met static devant SetTimer et KillTimer dans le .h ca ne marche pas...

    Aidez moi s'il vous plait !! je suis perdue ...

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 126
    Par défaut
    C'est bon j'ai réglé le problème de static. J'ai créé un objet CWnd timer et j'ai appelé ma fonction de la manière suivante : timer.SetTimer(1, 10, 0);
    J'ai fait de même avec KillTimer.

    Par contre maintenant j'ai l'erreur suivante à l'éxecution:
    J'ai les lignes relatives à SetTimer et Killtimer de surligner dans le fichier afxwin2.h et le message suivant : .exe has triggered a breakpoint!

    Que dois je faire?

  6. #6
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    salut,

    as tu lu entierement la MSDN sur la fonction SetTimer() ???

    il ne suffit pas de faire dériver une classe de CWnd pour utiliser SetTimer ...
    ok le compilateur ne dit plus rien, mais c'est pas du tout fonctionnel

    un Timer est soit rattaché à une fenetre, soit rattaché à un thread à condition qu'il possède une boucle à message...

    dans ton cas, tu essayes de rattacher un timer à une fenetre qui n'existe pas ... donc normal que ça plante

    utilises la fonction globale SetTimer() en indiquant une procédure et non la méthode SetTimer() de la classe CWnd

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    m_IdTimer=::SetTimer(NULL,0,1000,TimerProc);  // création d'un timer qui bat à la seconde
     
    ...
     
    KillTimer(m_IdTimer);  // pour arreter le timer
     
    ...
     
    VOID CALLBACK TimerProc(HWND /*hwnd*/,UINT /*uMsg*/,UINT_PTR /*idEvent*/,DWORD /*dwTime*/)
    {
      // ici la procédure du timer
    }
    tu auras remarqué que j'ai mis le préfixe "m_" devant la variable m_IdTimer. C'est à dire que c'est une variable membre de la classe et qu'elle doit etre persistante pendant toute la durée de vie du timer, sinon tu pourras pas arreter le Timer ...

    @+

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

Discussions similaires

  1. [MFC] erreur de compilation
    Par moulefrite dans le forum MFC
    Réponses: 3
    Dernier message: 03/05/2006, 15h26
  2. Réponses: 2
    Dernier message: 31/01/2006, 14h31
  3. [MFC] erreur sans le winmain
    Par r0d dans le forum MFC
    Réponses: 5
    Dernier message: 27/01/2006, 10h17
  4. [MFC] Erreur mémoire
    Par leMehdi dans le forum MFC
    Réponses: 8
    Dernier message: 26/01/2006, 16h09
  5. [MFC] erreur bizar a cause d'un activeX
    Par pitch21 dans le forum MFC
    Réponses: 12
    Dernier message: 29/06/2005, 14h36

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