Thread dans MFC [Visual C++] - Programmation
Marsh Posté le 18-07-2001 à 15:14:05
Je crois que les fonctions graphiques de Windows sont Thread restricted level B uniquement... Verifie que c'est bien dans ce cadre que tu les utilises...
Marsh Posté le 18-07-2001 à 16:11:13
Excuse moi mais je ne dois pas assez m'y connaître, alors comment dois-je le vérifier et comment faire si ce n'est pas le cas ?
Marsh Posté le 18-07-2001 à 16:53:43
une fonction peut etre No-Thread. non utilisable en multi-thread (rare)
elle peut etre Thread restricted Level A : utilisable uniquement par le thread principale celle qui a ete cree en meme temps que le process. encore une fois c'est rare.
elle peut-etre Thread restricted Level B : utilisable uniquement par un thread a la fois mais n'importe lequel (deja plus frequent)
enfin elle peut etre Thread-safe : utilisable par plusieurs threads simultanement...
Marsh Posté le 18-07-2001 à 19:06:52
Ok, merci.
Je fais comment alors pour que mon script marche ?
Marsh Posté le 19-07-2001 à 09:32:14
ANTSite a écrit a écrit : Ok, merci. Je fais comment alors pour que mon script marche ? |
1- Essaye en monothread pour valider
si il a le meme plantage en mono ca vien d'ailleurs
sinon assure toi que deux thread n'accedent pas aux objets MFC simultanement.
Marsh Posté le 19-07-2001 à 10:34:04
C'est c'est un problème de multithread regarde si il n'existe pas une fonction dans les MFC pour serialiser(serialize in english, permet de faire une file d'attente ) les appelles aux fonctions graphiques.
Avec Borland et les VCL ( equivalent aux MFC) ça existe.
Marsh Posté le 19-07-2001 à 12:58:43
Salut,
Ton probleme est tres simple et c'est pas du tout un probleme du au multithread.
Ta boite de dialogue k n'existe pas !!!! Tu as instancie un objet (k) mais je vois pas le DoModal() ou Create() donc ta boite n'existe pas et tu cherches a acceder au contenu d'un controle aui n'existe pas donc son pointeur ou handle est nul, d'ou le plantage.
Par contre je pense que tu as bien une boite de dialogue qui est cree ailleurs dans ton code et bien il faut que tu passes un ointeur sur celle-ci a ta fonction qui tourne dans l'autre thread, ainsi tu pourras recuperer ta donne et maniper la boite de dialogue.
En fait si je comprends ce que tu as fait tu as cree 2 boites de dialogue differentes et ca c'est pas bon.
Guz.
Marsh Posté le 19-07-2001 à 13:35:14
Merci guz,
tu peux me dire comment créer le pointeur, svp ?
Marsh Posté le 19-07-2001 à 14:01:12
Ok je t'explique :
imagine que nous sommes dans le fonction qui appelle la boite de dialogue et qui lance le thread.
.....
CKeyLoger k; /? ou le nom que tu as mis
k.Create( xxxxx, xxxx );
CreateThread( NULL,
0,
recpt,
(void*)&k,
xxx,
&yyy
);
....
void recpt(void* pDialog)
{
CString letters;
CKeyLoger* pKeyLoger; //Classe de la boîte de dialogue
char ltr[5];
pKeyLoger = (CKeyLoger*) pDialog; // Recuperation d'un pointeur
do
{
strcpy(ltr,"" );
pKeyLoger->m_key.GetWindowText(letters); //C la que ça plante
recv(c,ltr,sizeof(ltr),0);
letters += ltr;
pKeyLoger->m_key.SetWindowText(letters); //C la que ça plante
Sleep(100);
}
while(stop == false);
_endthread();
}
mettre un & devant le nom d'une variable c'est travailler avec son adresse donc avec qqchose qui est le contenu d'un pionteur. bref.
Marsh Posté le 18-07-2001 à 13:59:17
J'utilise un thread dans une MFC (boîte de dialogue).
Dans la fonction éxécutée dans le nouveau thread, je souhaite agir sur des éléments de la boîte de dialogue.
Ca compile sans erreurs, mais ça plante à l'éxécution du thread.
Voilà un bout du code
void recpt(void*)
{
CString letters;
CKeyLoger k; //Classe de la boîte de dialogue
char ltr[5];
do
{
strcpy(ltr,"" );
k.m_key.GetWindowText(letters); //C la que ça plante
recv(c,ltr,sizeof(ltr),0);
letters += ltr;
k.m_key.SetWindowText(letters); //C la que ça plante
Sleep(100);
}
while(stop == false);
_endthread();
}
Comment faire alors pour agir sur un contrôle dans une fonction non membre de la classe de la Boîte de dialogue ?