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] CFormView, Thread et rafraichissement


Sujet :

MFC

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 49
    Par défaut [MFC] CFormView, Thread et rafraichissement
    Bonjour à tous,

    Je vous écris pour vous demander un question qui serais supposé être facile à faire mais que j'ai un problème avec. Mon aplpication contient un seul document qui est enregistrer manuellement dans un BD. Le problème n'est pas là.

    J'ai un traitement a faire dans un Thread avec une fonction static(Worker Thread). Le traitement ce fait, mais quand il est rendu le temps de faire la MAJ de la fenêtre(CFormView) bien le programme plante. Voici un exemple de 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
     
    for (int indexRat=0;indexRat<session->countRat();indexRat++)
    {
       CRat *r = session->getRatAt(indexRat);
       CString sql = "Update Rat SET whitePart = "+numberToString(r->getWhite())+
                     ", neutralPart = "+numberToString(r->getNeutral())+
             	     ", blackPart = "+numberToString(r->getBlack())+
    	              " where numRat = "+numberToString(r->getNumero());
       db.ExecuteSQL(sql);
    }
    db.Close();
    //MAJ de la fenêtre
    ((CExperienceView *)session->getViewWnd())->initSessionData();
    ((CExperienceView *)session->getViewWnd())->initSessionData(session);
    La fonction InitsessionData prend les données de l'objet et les affectent à des variables membres de la vue, ensuite elle exécute UpdateData(FALSE). Merci d'avance pour votre aide.

  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
    bonsoir ,la réponse est tres simple :
    Pas d'appels GUI MFC directs dans un worker thread.
    voir explications et solution faq:
    http://c.developpez.com/faq/vc/?page...d#WorkerThread
    definition d'un message privé:
    http://www.developpez.net/forums/vie...567222#1567222

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 49
    Par défaut Encore un problèeme...
    En fait, l'objet session(CSession) est une classe MFC comme tu le dit, mais ce n'est aps un document. Je sais pas comment vraiment L'explique, mais le document a une liste de Session et la vue affiche cette liste, et a chaque fois que l'utilisateur change la sélection la vue est rafraichie avec la nouvelle session.Alors je sais pas tu m'as mis sur une piste, mais j'aurais besoin d'accèder a l'interieur de mon WorkerThread a un attribut public qui est un pointeur sur la session courrante.Merci d'avance...

  4. #4
    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
    j'ai crus comprendre que UpdateData se faisait par l'intermediare du thread .
    c'est pas le cas ?
    au final la portion de code dans ton post est située dans le Thread ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 49
    Par défaut Oui, UpdatData est dans le Thread
    Oui, il y a en effet un UpdatData dans le Thread, mais je dois modifier les données dans le Thread. Voici la classe View:
    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
     
    class CExperienceView : public CFormView
    {
    protected: // create from serialization only
       CExperienceView();
       DECLARE_DYNCREATE(CExperienceView)
     
    public:
      //{{AFX_DATA(CExperienceView)
        enum { IDD = IDD_GRAPHIQUE_FORM };
        //Variable membre lier au controle	
      //}}AFX_DATA
    // Attributes
    public:
      CExperience* GetDocument();
    // Operations
    public:
    // Overrides
      // ClassWizard generated virtual function overrides
      //{{AFX_VIRTUAL(CExperienceView)
    public:
      virtual BOOL PreCreateWindow(CREATESTRUCT& cs);	
    protected:
      virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
      virtual void OnInitialUpdate(); // called first time after construct	
      virtual void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint);
      //}}AFX_VIRTUAL
    // Implementation
    public:
      CSession * currentSession;
      void initSessionData(CSession *s = NULL);
      void UpdateCage(CCage &c);
      virtual ~CExperienceView();
    #ifdef _DEBUG
      virtual void AssertValid() const;
      virtual void Dump(CDumpContext& dc) const;
    #endif
    protected:
    // Generated message map functions
    long OnReceiveRefresh(WPARAM wparam,LPARAM lparam);
    protected:
      //{{AFX_MSG(CExperienceView)
        afx_msg void OnSelchangeCOMBOListeSession();
        afx_msg void OnBUTTONStart();
      //}}AFX_MSG
      DECLARE_MESSAGE_MAP()
    private:
      CWinThread *threadTest;	
    };
    En cliquant sur un bouton, qui appel la fonction OnButtonstart un Thread est démarré, le WorkerThread reçoit un Handle sur la vue, mais j'aimerais dans le Thread obtenir le pointeur sur la variable public CSession currentSession pour pouvoir modifier l'objet et ensuite rafraichir la fenètre. Merci d'avance.

  6. #6
    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 Re: Oui, UpdatData est dans le Thread
    Citation Envoyé par Philippe299
    Oui, il y a en effet un UpdatData dans le Thread, mais je dois modifier les données dans le Thread. Voici la classe View:
    et bien en fonction de ce je t'ai indiqué c'est normal que ça plante .
    pas de MFC GUI dans un thread ,pas de UpdateData etc...
    fait faire le boulot en envoyant a partir du thread un message privé a la view .


  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 49
    Par défaut Problème règler..:D
    Merci ça marcher. Le fait est que dans mon cas je ne donne pas en paramètre a mon Thread un Handle sur le vue, mais que l'objet que je veux modifier, soit Session a un pointeur sur la vue. Donc le Thread reçoit mon Objet Session et va chercher un Handle sur la vue pour lui Poster des messages avec des paramètres pour afficher des messages d'erreur s'il y en a.

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

Discussions similaires

  1. [MFC] CDialog -> forcer le rafraichissement
    Par Rafoo dans le forum MFC
    Réponses: 3
    Dernier message: 05/09/2006, 16h51
  2. [MFC] CFormView ListBox
    Par julien.nasser dans le forum MFC
    Réponses: 1
    Dernier message: 26/04/2006, 15h04
  3. [MFC] classe thread
    Par Joeleclems dans le forum MFC
    Réponses: 13
    Dernier message: 24/05/2005, 14h31
  4. [MFC] dialog & thread & progressbar
    Par Tigris94 dans le forum MFC
    Réponses: 4
    Dernier message: 05/04/2005, 15h51
  5. [MFC] UpdateData() + thread
    Par MadChris dans le forum MFC
    Réponses: 6
    Dernier message: 03/06/2004, 20h55

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