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 :

[MFC] Thread et timer


Sujet :

MFC

  1. #1
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut [MFC] Thread et timer
    Bonjour à tous,

    j'essaie de résoudre un problème de freeze en utilisant un timer dans une thread. J'ai donc une thread 'ThreadListen' (qui est une fonction membre 'static' de ma classe CMonObjet), et j'essaie de lancer un timer (que j'ai déclaré comme fonction 'libre', non membre de ma classe CMonObjet) dans cette thread:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     //MonObjet .h
    void CALLBACK TimerCallback(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2);
    class CMonObjet
    {
    ...
    protected:
    	static UINT ThreadListen(LPVOID lpvParam);
    };
    et le .cpp
    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
    // MonObjet.cpp
    UINT CMonObjet::ThreadListen(LPVOID lpvParam)
    {
    CMonObjet* monObjet = (CMonObjet*) lpvParam;
    monObjet ->SetTimerId(timeSetEvent(monObjet ->GetTimerDelay(), 200, TimerCallback, (DWORD) monObjet , TIME_ONESHOT|TIME_CALLBACK_FUNCTION));
    ReadFile(monObjet ->GetPortHandle(), &oRxByte, 1, &dwNbBytesRead, NULL);
    timeKillEvent((UINT) monObjet ->GetTimerId());
    }
     
    //et la callback:
    void CALLBACK TimerCallback(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
    {
    	CMonObjet* monObjet = (CMonObjet*) dwUser;
    	DWORD dwExitCode;
    	GetExitCodeThread(monObjet ->GetThreadHandle(), &dwExitCode);
    	TerminateThread(monObjet ->GetThreadHandle(), dwExitCode);
    	AfxMessageBox("thread killed");
    }
    Et j'ai 2 problèmes que je ne parviens pas à résoudre:
    1/ j'ai 2 casts qui génèrent les 2 warnings suivants:
    troncation de pointeur de 'CMonObjet*' à 'DWORD' (ligne timeSetEvent())
    et 'cast de type'*: la conversion de 'DWORD' en 'CMonObjet*' d'une taille supérieure (premiere ligne de la callback)
    Comment éviter ces warnings?

    2/ un problème de link:
    error LNK2019: symbole externe non résolu __imp__timeKillEvent@4 référencé dans la fonction "protected: static unsigned int __cdecl CMonObjet::ThreadListen(void *)" (?ThreadListen@CMonObjet@@KAIPAX@Z)
    je ne comprends pas cette erreur. Quelqu'un pourrait me donner quelques explications?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  2. #2
    mat.M
    Invité(e)
    Par défaut
    Pour timeKillEvent dans settings inclure winmm.lib
    timeKillEvent
    The timeKillEvent function cancels a specified timer event.

    MMRESULT timeKillEvent(
    UINT uTimerID
    );


    Header: Declared in mmsystem.h.
    Import Library: Use winmm.lib.


    A ma connaissance il est déconseillé d'utiliser un Timer avec un Thread.
    C'est soit l'un soit l'autre sinon on aura inévitablement des pb de désynchronisation
    Supposons que j'ai un timer : tous les 5000 Ms un thread est exécuté pour télécharger un fichier via FTP ;
    si au bout des 5000 Ms mon téléchargement n'est pas terminé que se passe-t-il ?

  3. #3
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par mat.M
    Pour timeKillEvent dans settings inclure winmm.lib
    erf, j'avais inclus le fichier mais j'avais oublié de faire le lien dans les settings.

    Citation Envoyé par mat.M
    A ma connaissance il est déconseillé d'utiliser un Timer avec un Thread.
    C'est soit l'un soit l'autre sinon on aura inévitablement des pb de désynchronisation
    Supposons que j'ai un timer : tous les 5000 Ms un thread est exécuté pour télécharger un fichier via FTP ;
    si au bout des 5000 Ms mon téléchargement n'est pas terminé que se passe-t-il ?
    Je suis d'accord, mais dans mon cas, le timer est "ONE_SHOT". Il appelle ma callback une seule fois puis il s'arête. Donc pas de problème de synchro.

    P.S: de toute façon, ce que j'essayais de faire ne fonctionne pas: je kill mon thread, mais l'appli reste quand-même bloquée sur le ReadFile
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

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

Discussions similaires

  1. [MFC] Thread
    Par romeo9423 dans le forum MFC
    Réponses: 2
    Dernier message: 25/03/2005, 14h20
  2. [MFC] Thread & memory leaks
    Par Racailloux dans le forum MFC
    Réponses: 7
    Dernier message: 15/03/2005, 12h44
  3. Module Threading, utilisation timer(x,y) .
    Par aladin46 dans le forum Général Python
    Réponses: 3
    Dernier message: 02/01/2005, 18h55
  4. Réponses: 3
    Dernier message: 11/02/2004, 12h50
  5. [MFC][Debutant] UpdateData, timer et CEdit
    Par Fladnag dans le forum MFC
    Réponses: 2
    Dernier message: 29/01/2004, 06h51

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