[MFC] Multithreading, Thread Worker
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
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
|
#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.h
Code:
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);
[...] |
CTestDlg.cpp
Code:
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.