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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    r0d
    r0d est d�connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 299
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 4 299
    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?

  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�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 299
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 4 299
    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

+ 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