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

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 42
    Points : 22
    Points
    22
    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 éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 068
    Points : 12 111
    Points
    12 111
    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 à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 42
    Points : 22
    Points
    22
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    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 à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 42
    Points : 22
    Points
    22
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    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
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    En lisant ta réponse, je me suis dit : "Mais oui bien sûr que c'est ça !".

    Et en l'appliquant, toujours la même erreur : "pointeur vers un type classe incomplète non autorisé".

    Je ne comprends pas...

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 068
    Points : 12 111
    Points
    12 111
    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.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Ok, je vais regarder ça ce soir.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Citation Envoyé par bacelar Voir le message
    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/
    Ça, en théorie ça n'a jamais été un problème (vu que sous Win16 un pointeur "normal" aurait été court de toute façon) et en pratique ça n'a été un problème que pour Windows 9x dans le cas précis de SendMessageTimeout(). Ça n'est clairement pas un problème de nos jours, où WPARAM et LPARAM sont des UINT_PTR et LONG_PTR respectivement.

    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.
    Au contraire, c'est la pratique courante pour une communication inter-thread à sens unique: Allouer dans le thread appelant, passer à la fonction de création de thread, et "oublier" (du pur "fire-and-forget"), et libérer dans le thread destinataire. Il y a donc un transfert de responsabilité qui doit se faire hors d'un pointeur intelligent parce que la fonction de création de thread n'accepte qu'un pointeur bête.

    Par contre, on pourrait quand même avoir un pointeur intelligent de chaque côté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    UINT __cdecl ThreadProc(void* ptr) //AFX_THREADPROC has different requirement from LPTHREAD_START_ROUTINE
    {
    	unique_ptr<ThreadInfos> spInfos(static_cast<ThreadInfos*>(ptr));
    	FEMU femu(spInfos);
    	return 0;
    }
     
    ...
     
    {
    	unique_ptr<ThreadInfos> spInfos = make_unique<ThreadInfos>();
    	spInfos->hWnd = pDlg->hWnd;
    	AfxBeginThread(ThreadProc, spInfos.release());
    }
    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.
    Là, je suis d'accord.
    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.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Merci à vous deux de perdre un peu de temps avec mon cas.

    Bon, j'ai essayé de faire ce que vous me conseillez. Effectivement, maintenant j'ai accès aux infos mais si on revient à la question initiale, le message à poster est toujours non défini.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include "FEMU.h"
    #include "ThreadInfos.h"
     
    FEMU::FEMU(void *pThreadInfos)
    {
    	ThreadInfos *ptr = (ThreadInfos*)pThreadInfos;
    	for (int i = 0; i < 100; i++){
    		Sleep(100);
    		ptr->itr = i + 1;
    		PostMessage(ptr->hWnd, WM_MESSAGE, reinterpret_cast<WPARAM>(ptr), 0); // WM_MESSAGE inconnu
    	}
    }
    WM_MESSAGE est défini dans CDialog.cpp. Du coup, dois-je le passer à la classe ThreadInfos ou au contraire en créer un nouveau pour l'envoyer au CDialog ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Rajoute-le dans ThreadInfos pour plus de souplesse et pour éviter de dupliquer la valeur.
    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.

  13. #13
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Bon, ça ne marche toujours pas. J'ai essayé plein de choses mais il y a toujours un truc qui manque ou qui n'est pas reconnu. Je perds beaucoup de temps là-dessus parce que je ne maîtrise pas le langage.

    Du coup, toutes mes classes, je vais les mettre directement dans le CDialog.cpp. C'est précisément ce que je voulais éviter mais je ne suis pas capable de faire autrement donc tant pis.

    Merci à vous deux quand même pour m'avoir aidé.

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 068
    Points : 12 111
    Points
    12 111
    Par défaut
    Vous bloquez juste sur le fait de faire un .h et un .cpp par classe ???

  15. #15
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Bon je m'y suis remis et j'ai réussi. Les erreurs venaient de plusieurs choses :

    - je passais l'adresse du pointeur de la classe ThreadInfos au thread au lieu de passer le pointeur lui-même ;
    - le message également n'était pas bon.

    Bref, plein de conneries.

    En fait, c'est hyper simple. Maintenant que je viens de le faire, je comprends exactement la logique du code.

    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
    49
    50
    51
    52
    53
     
    // CDialog.cpp
     
    #define WM_THREAD_MESSAGE		WM_APP+1
     
    ON_MESSAGE(WM_THREAD_MESSAGE, &CIdMDICx64Dlg::ThreadMessage)
     
    LRESULT CDialog::ThreadMessage(WPARAM wParam, LPARAM)
    {
    	ThreadInfos *pThreadInfos = (ThreadInfos*)wParam;
    	barre_progression.SetPos(pThreadInfos->itr);
    	pThreadInfos->str.Format(_T("Processus : %d"), pThreadInfos->itr);
    	affich_processus.SetWindowText(pThreadInfos->str);
    	return 0;
    }
     
    void CDialog::OnBnClickedCalcul()
    {
    	pThreadInfos = new ThreadInfos;       // pThreadInfos est membre de CDialog
    	pThreadInfos->hWnd = m_hWnd;
            pThreadInfos->Message = WM_THREAD_MESSAGE;
    	pThread = AfxBeginThread(ThreadCalcul, pThreadInfos, THREAD_PRIORITY_NORMAL, 0, 0);
    }
     
    static UINT ThreadCalcul(void *pParam)
    {	
    	ThreadInfos *pThreadInfos = (ThreadInfos*)pParam;
    	FEMU test(pThreadInfos);
    	return 0;
    }
     
    // FEMU.cpp
    FEMU::FEMU(ThreadInfos *ptr)
    {
    	ThreadInfos *pThread = (ThreadInfos*)ptr;
    	for (int i = 0; i < 100; i++){
    		Sleep(100);
    		pThread->itr = i + 1;
    		PostMessage(pThread->hWnd, pThread->Message, reinterpret_cast<WPARAM>(pThread), 0);
    	}
    }
     
    // ThreadInfos.h
    class ThreadInfos
    {
    public:
    	ThreadInfos();
    	~ThreadInfos();
    	HWND hWnd;
    	int itr;
    	UINT Message;
    	CString str;
    };
    Merci encore pour votre aide.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Attention, tu oublies de détruire l'objet à la fin de ton traitement. Mais attention, PostMessage() étant asynchrone, le seul moyen qu'il te reste pour détruire l'objet est de le faire détruire par le thread principal, une fois qu'il reçoit un message lui disant que le traitement est terminé...

    PS: Pourquoi fais-tu ce traitement dans un constructeur?
    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.

  17. #17
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Oui, effectivement j'ai oublié de mettre cette partie du code. En fait, je le supprime en fermant la dialogue ou en recommençant le thread :

    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
     
    // CDialog.cpp
     
    void CDialog::OnBnClickedCalcul()
    {
            if (pThreadInfos != NULL) { delete pThreadInfos; pThreadInfos = NULL; }
    	pThreadInfos = new ThreadInfos;       // pThreadInfos est membre de CDialog
    	pThreadInfos->hWnd = m_hWnd;
            pThreadInfos->Message = WM_THREAD_MESSAGE;
    	pThread = AfxBeginThread(ThreadCalcul, pThreadInfos, THREAD_PRIORITY_NORMAL, 0, 0);
    }
     
    void CDialog::OnClose()
    {
    	if (pThreadInfos != NULL) { delete pThreadInfos; pThreadInfos = NULL; }
    	CDialogEx::OnClose();
    }
    Je ne sais pas si c'est la bonne méthode par contre.

    Concernant le traitement dans le constructeur, je l'ai mis comme ça, je n'ai pas réfléchi. La difficulté pour moi, c'était d'utiliser une classe dans un thread tout en envoyant des infos à la dialogue. Maintenant, je vais changer pour implémenter vraiment toutes les méthodes de ma classe et poster les messages à partir des ces méthodes.

  18. #18
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 068
    Points : 12 111
    Points
    12 111
    Par défaut
    Ta gestion du cycle de vie de "pThreadInfos" est acrobatique et complexe (et non safe).
    Le plus simple, c'est de ne pas en faire un champ et de suivre le conseil de @Médinoc.

  19. #19
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Ok, je vais faire le nécessaire.

    Merci pour les conseils

  20. #20
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Je vais encore vous embêter un petit peu...

    Au lieu d'envoyer un message pour détruire pThreadInfos comme vous le suggérez, n'est-il pas plus simple d'utiliser un CEvent ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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