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] PostMessage depuis Thread vers CDialog


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 42
    Par défaut [MFC] PostMessage depuis Thread vers CDialog
    Bonjour à tous,

    je vous explique mon petit souci : j'ai une boîte de dialogue CDialog à partir de laquelle je lance un Thread de Travail en cliquant sur un bouton.
    De ce côté-là, tout va bien, j'ai fait une méthode LRESULT, j'ai ajouté ON_MESSAGE dans le message map, j'ai défini un message windows WM_APP+1.

    Quand je lance mon Thread, j'aimerais utiliser une classe C++ que j'ai faite.

    Le problème est comment j'utilise PostMessage pour envoyer des infos concernant la mise à jour des contrôles visuels (barre de progression...).

    En effet, quand je met le code de ma classe directement dans le thread, ça marche parce que le message WM_APP+1 est défini dans la classe CDialog.

    Mais si je crée une instance de ma classe dans le thread, alors je n'ai plus accès au message WM_APP+1 car il est privé.

    Un petit bout de code juste histoire de :

    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
     
    // CDialog.cpp
    #include "CDialog.h"
    #include "FEMU.h"
    #define WM_MESSAGE WM_APP+1
     
     
    static UINT Thread(void *pParam)
    {
          FEMU test(pParam); // instance de ma classe FEMU dans le thread
          return 0;
    }
     
    // FEMU.cpp
    FEMU::FEMU(void *pParam)
    {
          PostMessage(???)
    }
    J'espère avoir été clair. Merci d'avance pour votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 502
    Par défaut
    C'est quel PostMessage que vous voulez utiliser ???

    https://msdn.microsoft.com/fr-fr/library/9tdesxec.aspx

    https://msdn.microsoft.com/fr-fr/lib...(v=vs.85).aspx

    alors je n'ai plus accès au message WM_APP+1 car il est privé
    What, c'est une MACRO, les problèmes majeurs des MACRO, c'est que tout le monde(n'importe quel code) peut s'en servir et que le typage est à la rue.

    Je ne vois pas trop la difficulté, dans le constructeur de votre thread, vous passez tous les paramètres dont il a besoin pour faire son job.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 42
    Par défaut
    Donner les paramètres au thread, ce n'est pas un problème. C'est surtout comment les récupérer une fois dans ma classe C++ (qui ne dérive pas d'une CDialog).

    Voici un exemple de base pour illustrer :

    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
     
    void CDialog::OnBnClickedCalcul()
    {
    	ThreadInfos *pThreadInfos = new ThreadInfos;               // ThreadInfos est une structure globale (je sais que ce n'est pas bien :aie:)
    	pThreadInfos->hWnd = m_hWnd;
    	pThread = AfxBeginThread(ThreadCalcul, pThreadInfos, THREAD_PRIORITY_NORMAL, 0, 0);
    }
     
    static UINT ThreadCalcul(void *pParam)
    {	
    	ThreadInfos *pThreadInfos = (ThreadInfos*)pParam;
    	for (int i = 0; i < 100; i++){
    		Sleep(100);
    		pThreadInfos->itr = i + 1;
    		PostMessage(pThreadInfos->hWnd, WM_THREAD_MESSAGE, reinterpret_cast<WPARAM>(pThreadInfos), 0);
    	}
    	delete pThreadInfos;
    	return 0;
    }
    Cela fonctionne très bien, mais si maintenant j'utilise ma classe FEMU (dans laquelle j'ai des calculs à faire) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    static UINT ThreadCalcul(void *pParam)
    {	
    	ThreadInfos *pThreadInfos = (ThreadInfos*)pParam;
    	FEMU test(pThreadInfos);
    	delete pThreadInfos;
    	return 0;
    }
    Il se trouve alors que je n'ai accès à rien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    FEMU::FEMU(void *ptr)
    {
           	for (int i = 0; i < 100; i++){
    		Sleep(100);
    		ptr->itr = i + 1;            // Impossible d'utiliser ptr
    		PostMessage(pThreadInfos->hWnd, WM_THREAD_MESSAGE, reinterpret_cast<WPARAM>(ptr), 0);     // Impossible d'utiliser WM_THREAD_MESSAGE
    	}
    }
    Je sais que la solution n'est pas loin mais je ne vois pas quoi faire.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FEMU::FEMU(ThreadInfos *ptr)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 42
    Par défaut
    J'ai essayé, ça ne fonctionne pas non plus. Il me dit que ThreadInfos n'est pas défini. Ce qui me paraît normal car cette structure globale est définie dans CDialog.cpp. Ma classe FEMU est définie dans les fichiers FEMU.h et FEMU.cpp.

    J'ai essayé aussi de faire ça dans FEMU.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class CDialog;
    class FEMU
    {
    public:
         FEMU(ThreadInfos *ptr);
         ~FEMU();
    }
    mais ça ne change rien.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    et ceci?
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class CDialog;
    class ThreadInfos;
     
    class FEMU
    {
    public:
         FEMU(ThreadInfos *ptr);
         ~FEMU();
    };
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 502
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PostMessage(pThreadInfos->hWnd, WM_THREAD_MESSAGE, reinterpret_cast<WPARAM>(pThreadInfos), 0);
    Pas le "WPARAM" pour un pointeur, SVP.
    https://blogs.msdn.microsoft.com/old...5-00/?p=41713/

    Deleter un pointeur que vous avez passé en paramètre d'un message, là, c'est des emmerdes assurés.
    L'utilisation shared_ptr et une gestion du cycle de vie des objets de type "ThreadInfos" s'impose.

    Je ne comprends pas...
    Heu, là, c'est quand même le b.a.-ba du C++, les classes.

    "ThreadInfos" est une classe comme une autre. Créez un .h et un .cpp (si nécessaire) contenant respectivement la déclaration et l'implémentation de cette classe.
    Comme est sera utilisée par 2 classes différentes : "CDialog" et "FEMU", il faut la mettre dans un ensemble de fichiers (.h .cpp) distinct.
    Dans les .cpp de ces 2 classes, vous ajoutez un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "ThreadInfos.h"
    où il faut.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/10/2008, 16h14
  2. [MFC] PostMessage, multithread
    Par Joeleclems dans le forum MFC
    Réponses: 6
    Dernier message: 24/05/2005, 16h17
  3. [MFC] Priorité a une fentres CDialog
    Par Coubiac dans le forum MFC
    Réponses: 3
    Dernier message: 28/02/2005, 13h04
  4. [MFC] différence entre CView et CDialog?
    Par r0d dans le forum MFC
    Réponses: 3
    Dernier message: 22/02/2005, 16h23
  5. Faire un drag and drop depuis IE vers un TListView
    Par ALEX77 dans le forum Composants VCL
    Réponses: 8
    Dernier message: 11/11/2004, 15h27

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