Bonjour,
J'ai un probl�me avec le multithreading MFC, je voudrai qu'un thread externe � ma boite de dialogue puisse appeler des fonctions de cette boite de dialogue.
En faites je voudrai que ma boite de dialogue lance un thread worker qui puisse afficher des informations via la boite de dialogue dans un simple label par exemple, pour cela il y a une m�thode publique Echo(char *texte) dans ma boite de dialogue qui permet d'afficher du texte.
CTestDlg est compos� d'une classe Clol, lorsque j'appuie sur le bouton ok, Clol lance un thread qui va afficher quelque chose dans un label de CTestDlg toutes les secondes en appelant la fonction Echo, j'ai utilis� le handle de la boite de dialogue et utilis� la fonction FromHandle() pour r�cup�rer CTestDlg dans le thread externe mais ca ne fonctionne pas, ca plante dans la fonction Echo() de CTestDlg, au niveau de la ligne loltexte.SetString(buff) :
Exception non g�r�e � 0x7832c55f (mfc80ud.dll) dans Test.exe : 0xC0000005: Violation d'acc�s lors de la lecture de l'emplacement 0xf3d030fd.
lol.cpp
CTestDlg.h
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 #include "stdafx.h" #include "lol.h" #include "TestDlg.h" HWND Clol::hwnd = 0; void Clol::Start(){ AfxBeginThread(Clol::Thread,NULL); } UINT Clol::Thread(LPVOID param){ char text[20]; CTestDlg* la = (CTestDlg*)CWnd::FromHandle(Clol::hwnd); for(int i=0;i<10;i++){ sprintf(text,"Ok%d",i); la->Echo(text); Sleep(1000); } return 0; }
CTestDlg.cpp
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11 #include "lol.h" // boîte de dialogue CTestDlg class CTestDlg : public CDialog { [...] public: Clol a; CString loltexte; void Echo(char * txt); [...]
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 [...] void CTestDlg::Echo(char * texte){ wchar_t buff[500]; mbstowcs(buff,texte,500); //Ca plante ici loltexte.SetString(buff); UpdateData(false); } void CTestDlg::OnBnClickedOk() { a.hwnd = GetSafeHwnd(); a.Start(); } [...]
EDIT: Je ne peux pas passer par le syst�me des messages, ca fonctionne tr�s bien mais je ne peux pas utiliser cette m�thode car dans le cas r�el de mon probl�me (ici il s'agit d'une version simplifi�), Echo retourne une valeur que je dois r�cup�rer.
Partager