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 :

Réalisation d'un chronometre avec les MFC


Sujet :

MFC

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut Réalisation d'un chronometre avec les MFC
    Bonjour,

    Je desire en apprendre un peu plus sur les thread. Pour cela j'ai decide de realiser un petit projet.
    La realisation d'un chronometre.

    Le chrono:
    2 bouton:
    - initialiser
    - start/stop
    1 edit:
    - affichage du temps passer

    Pour le moment je n'affiche que le temps en seconde(pas de millisecondes).

    J'utilise GetTickCount() et AfxBeginThread(), trouver dans la FAQ:
    http://c.developpez.com/faq/vc/?page=ProcessThread

    Voici ma classe Dialog(je met que l'essentiel):
    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
     
    // CChronoDlg dialog
    class CChronoDlg : public CDialog
    {
    // Construction
    public:
    	CChronoDlg(CWnd* pParent = NULL);	// standard constructor
     
    // Dialog Data
    	enum { IDD = IDD_CHRONO_DIALOG };
     
    	static UINT myThread(LPVOID pvParam);	
        CWinThread *m_pThread;
     
    protected:
    	CEdit m_editChrono;
     
    	DWORD m_tDebut;
    	long m_hour;
    	long m_min;
    	long m_sec;
     
    public:
    	afx_msg void OnBnClickedButtonInit();
    	afx_msg void OnBnClickedButtonStart();
    };
    Maintenant l'implementation:
    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
     
    void CChronoDlg::OnBnClickedButtonInit()
    {
    	m_pThread = NULL;
    	pThis->m_editChrono.SetWindowTextA("00:00:00");
    }
     
    void CChronoDlg::OnBnClickedButtonStart()
    {
    	m_tDebut = GetTickCount();
    	m_pThread = AfxBeginThread(myThread, this);
        if(!m_pThread)
        {
            // Impossible de créer le thread !
            return;
        }
        return;
    }
     
    UINT CChronoDlg::myThread(LPVOID pvParam)
    {
    	CChronoDlg *pThis=reinterpret_cast< CChronoDlg *>( pvParam) ;
     
    	DWORD tNow, tDiff;
    	CString sTmp;
     
    	while(1) {
    		tNow = GetTickCount();
     
    		// La difference en seconde
    		tDiff = (tNow - pThis->m_tDebut)/1000;
    		// Les heures
    		pThis->m_hour = tDiff/3600;
    		tDiff -= pThis->m_hour*3600;
    		// Les minutes
    		pThis->m_min  = tDiff/60;
    		tDiff -= pThis->m_min*60;
    		// Les secondes
    		pThis->m_sec  = tDiff;
     
    		// On formate
    		sTmp.Format("%02d:%02d:%02d",pThis->m_hour, pThis->m_min, pThis->m_sec);
    		// On affiche
    		pThis->m_editChrono.SetWindowTextA(sTmp);
    	}
     
    	return 0;
    }
    Donc en fait je voudrai savoir si deja je commence bien et si j'utilise les bonnes methodes. Si je fais pas du n'imp...
    Je n'en suis pas encore a la gestion des processus. Voici deja les petits problemes.
    Le programme me prend tout mon pross(100%).
    J'ai un clignotement rapide a l'affichage.

    Merci

  2. #2
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Points : 661
    Points
    661
    Par défaut
    suivant la resolution de temps que tu dois fournir, tu pourrais stopper ton thread durant cette periode... -> liberant ton CPU et permettant un affichage non scintillant.


    je me rappelle egalement que j ai vu un code source de chronomètre sur 64bits qui était tres precis. Malheureusement je me souviens plus de son URL.
    Pour les details, cherche tout seul !

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    Oui, ok, mais bon je voudrai pouvoir a terme mesurer en milliseconde, ou au moins en centieme, comme un vrai chronometre.
    Et si tu trouve l'url je prend ;

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 303
    Points : 155
    Points
    155
    Par défaut
    Salut,

    Rien ne sert de rafraichir l'affichage aussi rapidement ou alors tu as vraiment de très bon yeux. De plus comme tu passes du temps à redessiner ton écran ta boucle est moins rapide et donc tu est moins précis.
    Si tu appelles ton code d'affichage toutes les 100ms c'est bien assez, il suffit d'ajouter sur le bouton stop un refresh avec la derniere valeur...
    un lien dans MSDN sur les compteurs haute résolution
    ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/winui/winui/windowsuserinterface/windowing/timers/abouttimers.htm#high_resolution

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    Ok! merci pour le lien. je vais voir ca.

    Donc ce que tu veux dire c'est genre je rajoute un sleep a chaque tour? vais tester

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/01/2007, 10h21
  2. les fichiers avec les mfc
    Par oclone dans le forum MFC
    Réponses: 4
    Dernier message: 05/01/2007, 15h30
  3. Programmation avec les MFC
    Par ksoft dans le forum MFC
    Réponses: 3
    Dernier message: 04/05/2006, 21h50
  4. Origine de Visual C++ - lien avec les MFC
    Par drinkmilk dans le forum MFC
    Réponses: 5
    Dernier message: 18/04/2005, 10h47
  5. Charger et afficher une image jpg avec les mfc
    Par glop - pas glop dans le forum MFC
    Réponses: 3
    Dernier message: 11/02/2004, 18h59

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