[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:
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.
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:
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.
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 .
:D