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 d'affichage


Sujet :

MFC

  1. #21
    Membre éprouvé
    Inscrit en
    Avril 2004
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    Par défaut
    En fait, la seule raison pour que tu ne récupères pas ton message, c'est que ton thread principal se retrouve bloqué et qu'il ne puisse pas traité le message que tu essaie de lui envoyé.

    Essaie en mettant en commentaire tout ce qu'il y a après dans ta fonction execute.

  2. #22
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 111
    Par défaut
    merci
    Tu as raison, en mettant tout ce qui suit en commentaire, ça passe!

  3. #23
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 111
    Par défaut
    ce qui bloquait c'était le "WaitForSingleObject(_threads[i]->m_hThread, 100);" : le problème c'est que mon prog principal doit attendre la fin des thread, mais doit aussi réagir aux messages que les threads lui envoient! et même si un thread envoie un message par PostMessage, alors le prog principal se bloque et attend : il ne rentre pas dans la fonction associé au message! comment faire?

  4. #24
    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
    et bien message privé :
    quand le thread a fini il envoie un message pour le signaler au prog principal.

  5. #25
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 111
    Par défaut
    et ce n'est pas PostMessage qui sert à ça? j'utilise déjà un post message, mais la fonction qui lui es associé n'est jamais appelée...

  6. #26
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 111
    Par défaut
    Je ne sais pas exactement pourquoi, mais lorsque mon application lance un thread des le départ et que ce même thread envoie d'autre thread, alors le systeme des messages fonctionne... mais maintenant, les threads que j'envoie font une boucle, et au second tours, ils se bloquent! en mettant visual en pause, je m'arrete sur la ligne soulignée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    BOOL AFXAPI AfxInternalPumpMessage()
    {
    	_AFX_THREAD_STATE *pState = AfxGetThreadState();
     
    	[u]if (!::GetMessage(&(pState->m_msgCur), NULL, NULL, NULL))[/u]
    (...)
    cette partie de code appartient au fichier thrdcore.cpp... est ce que quelqu'un peut m'éclairer? je ne comprends pas d'ou cela peut venir!

  7. #27
    Membre éprouvé
    Inscrit en
    Avril 2004
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    Par défaut
    Rien ne t'empêche de faire plusieurs Postmessage dans tes threads.
    WaitForSingleObject est une fonction bloquante, donc quand tu l'utilises, tu bloques ton thread un certain temps.

    Tu peux à la fin d'un thread poster un message signalant la fin du thread, il suffit que tu passes en paramètre l'id du thread se terminant.

    Si ton thread pricipal n'est pas bloqué, normalement tu dois recevoir le message.

  8. #28
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 111
    Par défaut
    c'est ce que je fais!
    mon thread est un while(bool){}, lorsqu'il arrive à la fin de la boucle, alors le thread envoie un message au thread principal, et se bloque. Le thread principal verifie s'il a encore besoin du thread : si c'est la cas, alors il le relance, sinon il met le bool de la boucle while à false et le relance (ce qui termine le thread).
    Le problème c'est que le premier passage dans la boucle se fait correctement, mais au second, il plante (cf message precedent). Au secours!

  9. #29
    Membre éprouvé
    Inscrit en
    Avril 2004
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    Par défaut
    Comment est-ce que tu relances ton thread dans les deux cas ?

  10. #30
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 111
    Par défaut
    dans les deux cas, c'est la fonction associé au PostMessage qui fait un "ResumeThread"

  11. #31
    Membre éprouvé
    Inscrit en
    Avril 2004
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    Par défaut
    Tu t'ais fait une classe dérivée de cwinthread ?

    Je te conseille la méthode suivante :

    Tu as deux events, un pour faire travailler ton thread, un pour l'arrêter.

    Tu fais un waitformultipleobjects sur ces event dans ton thread, tu le met dans une boucle while (1).

    Quand tu veux faire travailler ton thread, tu set l'event correspondant, il travaille puis retourne sur le wait.

    Quand tu veux qu'il se termine, tu set l'event correspondant, il sort du wait et la tu fais un break pour qu'il sorte du while.

    Ne pas oublier de faire des event uniques pour chaque thread.

    Voici un 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
     
     
    HANDLE TabEvent[2];
    DWORD dwRet;
     
    TabEvent[0] = hEvtDoWork;
    TabEvent[1] = hEvtSortie;
     
    while (1)
            {
            dwRet = ::WaitForMultipleObjects(2,TabEvent,FALSE,ININITE)
     
            if (dwRet == WAIT_OBJECT_0)
              {
              //traitement
              }
            else if (dwRet == WAIT_OBJECT_0+1)
            {
            //on sort
            break;
            } 
            }

    En espérant que ça t'aide.

  12. #32
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 111
    Par défaut
    Je vais essayer ta méthode, pour l'instant je ne travaille qu'avec des PostMessage et pas d'event. Pour répondre à ta question, je travaille avec la classe de base de thread : je n'ai pas de classe à moi.

Discussions similaires

  1. [MFC] Thread & memory leaks
    Par Racailloux dans le forum MFC
    Réponses: 7
    Dernier message: 15/03/2005, 12h44
  2. [MFC] Réaliser l'affichage d'un oscilloscope
    Par Racailloux dans le forum MFC
    Réponses: 7
    Dernier message: 04/03/2005, 00h52
  3. [MFC] probleme d'affichage en mode explorer
    Par ryu20 dans le forum MFC
    Réponses: 2
    Dernier message: 11/02/2005, 20h33
  4. Réponses: 3
    Dernier message: 11/02/2004, 12h50
  5. Thread et affichage direct3D plein écran
    Par Harry_polin dans le forum DirectX
    Réponses: 8
    Dernier message: 13/03/2003, 22h22

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