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 :

Pb affichage Edit Control appelé depuis thread


Sujet :

MFC

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 126
    Points : 37
    Points
    37
    Par défaut Pb affichage Edit Control appelé depuis thread
    Bonjour à tous!

    Ca fait pas mal de temps que je tourne en rond sur ce problème alors j'ai besoin de votre aide...

    J'ai un thread qui permet de recevoir des valeurs et de les afficher dans des edit control en continu.
    Je pensais faire ca:
    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
     
    long WINAPI thread14(long lParam)
    {
    	CString str;
     
    	while(1)
    	{
    	Card.getLeftPositionActual(NULL);
    	Card.getRightPositionActual(NULL);
     
     
    	CEdit* editFG=(CEdit*) GetDlgItem(NULL,IDC_EDIT3);
    	CEdit* editFD=(CEdit*) GetDlgItem(NULL,IDC_EDIT4);
    	CEdit* editHG=(CEdit*) GetDlgItem(NULL,IDC_EDIT7);
    	CEdit* editHD=(CEdit*) GetDlgItem(NULL,IDC_EDIT8);
     
    	str.Format(_T("%.1i"),Card.m_PosDInst);
    	editFG->SetWindowText(str);
     
    	str.Format(_T("%.1i"),Card.m_PosGInst);
    	editFD->SetWindowText(str);
     
    	str.Format(_T("%.1i"),Card.m_PreDInst);
    	editHD->SetWindowText(str);
     
    	str.Format(_T("%.1i"),Card.m_PreGInst);
    	editHD->SetWindowText(str);
     
     
     
    	}
    }
    Le projet compile mais à léxécution j'ai l'erreur suivante lorsque j'arrive à ce thread la:
    dans la fonction void CWND::SetWindowText(LPCTSTR lpzString) de winocc.cpp
    la ligne suivante est surlignée
    ENSURE(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL));

    je pense que ca vient du hwnd que je ne définis pas mais comment faire pour le définir correctement?

    merci d'avance

  2. #2
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    Bonjour,

    Effectivement, ça doit venir du fait que tu ne passes pas le handle de ta fenêtre à la méthode GetDlgItem. As-tu un pointeur ou une variable sur la fenêtre concernée ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 126
    Points : 37
    Points
    37
    Par défaut
    non pas vraiment... je ne vois pas comment faire ?
    Avec la fonction GetSafeHwnd() je récupére le HWND de la fenetre?

  4. #4
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    Ça, c'est pour avoir le handle. Mais avant d'avoir le handle, il faut avoir la fenêtre, sous forme de pointeur ou de variable. Où est-elle créée, cette fenêtre ?

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 126
    Points : 37
    Points
    37
    Par défaut
    euhhh j'ai utilisé les toolbox je ne l'ai pas créé manuellement mais par contre je l'appelle à partir de la fenêtre précédente de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    InstantResult *pDlg;
        pDlg = new InstantResult();
        pDlg->Create(InstantResult ::IDD,AfxGetMainWnd());
        pDlg->ShowWindow(SW_SHOW);
    le constructeur de cette fenêtre est alors le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    InstantResult::InstantResult(CWnd* pParent /*=NULL*/)
    	: CDialog(InstantResult::IDD, pParent)
    {
    }

  6. #6
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    Et ce pointeur pDlg, tu le connais à l'endroit où tu fais tes GetDlgItem ?

  7. #7
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut ,
    tu fais vraiment n'importe quoi sur cette ligne!:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CEdit* editFG=(CEdit*) GetDlgItem(NULL,IDC_EDIT3);
    tu castes violemment un handle de fenêtre HWND en un objet CEdit .
    comme si tu voulais passer d'une carotte a un radis.
    il ne faut pas s'étonner si ça plante..
    de plus comme tu utilises l'api Win32 pour GetDlgItem tu lui passes null en argument ce qu'elle ne vas pas apprécier puisque c'est sensé être la fenêtre dont l'identifiant IDC_EDIT3 fait partie.
    il y a un post dans la faq pour le travail avec un thread de travail et la mise a jour d'un interface MFC.

  8. #8
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    Si tu disposais d'un pointeur sur ta fenêtre tel que pDlg, tu pourrais faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CEdit* editFG = (CEdit*) pDlg->GetDlgItem(IDC_EDIT3);

  9. #9
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    l'accès direct aux objets GUI MFC fonctionnera en release pas en debug ...

  10. #10
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    Citation Envoyé par farscape Voir le message
    l'accès direct aux objets GUI MFC fonctionnera en release pas en debug ...
    Ah bon ! Pour quelle raison ?

  11. #11
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 126
    Points : 37
    Points
    37
    Par défaut
    PetitPapaNoel merci pour ta réponse.
    Cependant si je fais ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    InstantResult *pDlg;
    pDlg = new InstantResult();
     pDlg->Create(InstantResult ::IDD,AfxGetMainWnd());
     
    CEdit* editFG=(CEdit*) pDlg->GetDlgItem(IDC_EDIT3);
     
    str.Format(_T("%.1i"),Card.m_PosDInst);
    editFG->SetWindowText(str);
    je vais avoir une nouvelle fenêtre InstantResult qui va s'ouvrir ... et si je laisse que InstantResult *pDlg, le pointeur n'est pas initialisé.

  12. #12
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    Citation Envoyé par PetitPapaNoël Voir le message
    Ah bon ! Pour quelle raison ?
    Citation Envoyé par faq
    Explications :
    Dans un processus win32 tous les threads travaillent dans le même espace mémoire et peuvent accéder aux variables globales.
    En multi-thread les MFC stockent les tables sur les fenêtres et objets GDI localement sur le thread principal grâce au système TLS :thread-local-storage, justement pour éviter des accès intempestifs des différents threads.

    Donc bien retenir la règle suivante :
    On ne peut pas partager des objets MFC liés aux fenêtres ou d'objets GDI entre plusieurs threads de service.
    On passera le handle de fenêtre en paramètre dans la fonction AfxBeginThread pour établir le lien avec la fenêtre de traitement.
    a cause du stockage TLS, de manière officielle il n'est pas conseillé d'accèder aux objets MFC en release a partir d'un autre thread..
    en debug suivant les accès effectués ça plante.

  13. #13
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    Ok, je ne savais pas. Il faut dire que je n'ai encore jamais travaillé sur un projet multithread...
    Merci, Farscape pour cet éclaircissement !

  14. #14
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 126
    Points : 37
    Points
    37
    Par défaut
    C'est bon j'ai réglé mon pb :
    Je déclare un pointeur sur ma fenêtre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    InstantResult* fen;
    dans mon OnInitDialog, j'initialise mon pointeur:
    et enfin dans mon thread:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CEdit* editFG=(CEdit*) fen->GetDlgItem(IDC_EDIT3);
     
    str.Format(_T("%.1i"),Card.m_PosDInst);
    editFG->SetWindowText(str);
    Voila merci !!!!

  15. #15
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    Mais Farscape vient de dire qu'il ne fallait pas faire comme ça !

  16. #16
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 126
    Points : 37
    Points
    37
    Par défaut
    Mais comment je peux faire alors pour récupérer un pointeur vers ma fenêtre courante ?
    je vois pas :/

Discussions similaires

  1. Réponses: 10
    Dernier message: 06/12/2011, 13h56
  2. Réponses: 12
    Dernier message: 01/06/2006, 15h32
  3. [VB.NET] Probleme d'affichage de controle
    Par mic56 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 09/06/2004, 15h03
  4. affichage de controles sur un splash screen
    Par shrek dans le forum C++Builder
    Réponses: 3
    Dernier message: 20/11/2003, 19h59
  5. [CR][VB] Affichage d'un etat depuis VB
    Par Dayagnewende dans le forum SDK
    Réponses: 3
    Dernier message: 28/07/2003, 12h10

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