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 :

Accéder a une splitter view depuis un thread


Sujet :

MFC

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 101
    Par défaut Accéder a une splitter view depuis un thread
    Slt a tous,

    j'ai une application SDI splittée avec 4 panes. J'ai ajouter un bouton dans la toolbar, si bien que j arrive a ma fonction CMyApp::MyFunction.
    Dans cette fonction j arrive a avoir ma vue sans probleme en utilisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CBottomView* CDigicontApp::GetBottomView()
    {
        CMainFrame *pFrame=static_cast<CMainFrame*>( AfxGetMainWnd());
            CBottomView*pView=static_cast<CBottomView*>(pFrame->m_wndSplitter.GetPane(1,1));
        ASSERT(pView->IsKindOf(RUNTIME_CLASS(CBottomView)));
     
        return pView;
    }
    Probleme est que si dans ma fonction CMyApp::MyFunction, je cree un thread, dans ce meme thread l'appel a CDigicontApp::GetBottomView() ASSERT, ca ne marche pas...
    Comment accéder a ma vue depuis ce thread, car je dois absolument ecrire des informations en temps reel dans cette bottomView.

    Merci

  2. #2
    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
    salut,
    voir faq:http://cpp.developpez.com/faq/vc/?pa...d#WorkerThread
    sinon il existe une solution non recommandée MS et qui ne fonctionne qu'en release.
    c'est de passer le pointeur sur ta vue dans ton thread et d'accèder aux éléments de la vue .
    la méthode la plus sure étant le message privé.

  3. #3
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    salut,

    le probleme, quand tu créés un nouveau thread, la fonction AfxGetMainWnd() va te renvoyer un CWnd (et non un CMainFrame) qui possède le meme handle (HWND) que ta CMainFrame.

    la preuve, dans thrdcore.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // thread inherits app's main window if not already set
    		CWinApp* pApp = AfxGetApp();
    		if (pApp != NULL && 
    			pThread->m_pMainWnd == NULL && pApp->m_pMainWnd->GetSafeHwnd() != NULL)
    		{
    			// just attach the HWND
    			threadWnd.Attach(pApp->m_pMainWnd->m_hWnd);
    			pThread->m_pMainWnd = &threadWnd;
    		}
    donc je dirais d'essayer plutot ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CSplitterWnd *pSplitterWnd=STATIC_DOWNCAST(CSplitterWnd,AfxGetApp()->m_pMainWnd->GetDlgItem(AFX_IDW_PANE_FIRST));
    CBottomView *pView=STATIC_DOWNCAST(CBottomView,pSplitterWnd->GetPane(1,1));
    /!\ attention avec la synchro dans les thread /!\

    n'écrit pas des variables exposées a d'autres threads directement, utilises des mécanismes de synchro, ou mieux des SendMessage() avec des messages privés...

    @+

  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 101
    Par défaut
    farscape, merci, j ai deja essayé en debug, de passer un pointeur sur la vue, mais ca bloque quand j appelle GetWindowTextLength();
    (RichEditView)
    C est bien ca qui ne marche pas en debug mais en release?

  5. #5
    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
    Citation Envoyé par benoit70 Voir le message
    farscape, merci, j ai deja essayé en debug, de passer un pointeur sur la vue, mais ca bloque quand j appelle GetWindowTextLength();
    (RichEditView)
    C est bien ca qui ne marche pas en debug mais en release?
    oui

  6. #6
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 101
    Par défaut
    merci bien, c est gentil.
    J maintenant un autre probleme, en fait j ai cree ce thread car j effectue beaucoup d operations quand je clique sur un bouton de ma toolbar.
    meme avec ce thread ca fait pareil, je cree le thread dans CMyApp::OnDecrypt, et j attend la fin du thread avec un waitFor singleObject ds cette meme fonction.
    Le bouton reste dans un etat enfonce jusqu a la fin du thread. J ai essayer de mettre des Sleep(10) ds le thread mais ca donne rien, une idee peut etre?

    Merci d avance.

  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
    Par défaut
    salut,
    pourquoi attendre ? ,le fait d'attendre gèle l'interface.
    envoi plutôt un message du thread a l'interface pour signifier la fin du traitement.
    tu peux aussi au lancement du traitement rendre le bouton inactif
    et le réactiver a la fin du traitement du thread...
    http://cpp.developpez.com/faq/vc/?pa...tButtonToolBar

  8. #8
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 101
    Par défaut
    comment faire pour envoyer ce message depuis le thread stp?
    Je ne suis pas sur de savoir comment faire. Merci

  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

  10. #10
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 101
    Par défaut
    ah ca j ai deja essaye hier depuis MyCApp, j envoie le PostMessage sur :ostMessage( AfxGetMainWnd()->GetSafeHwnd(),WM_TEST,0,0) ;
    Mais elle ne le detecte pas. Ma fonction OnReceiveTest n est pas appellee.
    L exemple de la FAQ le fait sur la View, mais moi c'est independant de la vue. Je doit le faire depuis la CMyApp class.
    #define WM_TEST WM_USER+166 est mon define.

  11. #11
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    tu dois attraper le message privé dans ta CMainFrame

    les messages privés ne sont pas "routés" dans l'application comme c'est le cas pour les commandes.

    sinon utilises un ID de commande, et là tu peux l'intercepter dans ton MyCApp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AfxGetMainWnd()->PostMessage(WM_COMMAND,ID_MA_CMD_SPECIALE);
    puis dans MyCApp, aux bons endroits:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ON_COMMAND(ID_MA_CMD_SPECIALE,OnMaCmdSpeciale)
     
    ...
     
    void MyCApp::OnMaCmdSpeciale()
    {
    }
    l'inconvénient c'est que tu ne peux pas transmettre de paramètres avec ton message.

    sinon pour un message privé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AfxGetMainWnd()->PostMessage(WM_MSGPRIVE);
    puis dans ton CMainFrame:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ON_MESSAGE(WM_MSGPRIVE,OnMsgPrive)
     
    ...
     
    LRESULT CMainFrame::OnMsgPrive(WPARAM wParam,LPARAM lParam)
    {
      return 0;
    }

    @+

  12. #12
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 101
    Par défaut
    ON_MESSAGE(WM_MSGPRIVE,OnMsgPrive) ne compile pas dans le CMainFrame.

    Comment le definir?

  13. #13
    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
    as tu définit WM_MSGPRIVE ?
    comme dans le post de la faq ?

  14. #14
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 101
    Par défaut
    c'est ok ca marche, merci les stars

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

Discussions similaires

  1. Gestion d'une IHM Qt depuis un thread POSIX
    Par lulafitt dans le forum Multithreading
    Réponses: 1
    Dernier message: 02/03/2011, 00h28
  2. Accès à une méthode static depuis un thread
    Par fantomchris dans le forum MFC
    Réponses: 7
    Dernier message: 08/07/2009, 18h05
  3. Réponses: 6
    Dernier message: 28/02/2007, 09h37
  4. Réponses: 2
    Dernier message: 19/12/2006, 22h55
  5. Comment accéder à une DLL COM depuis un exécutable ?
    Par Denys dans le forum API, COM et SDKs
    Réponses: 10
    Dernier message: 20/09/2005, 08h04

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