[Visual C++] Thread dans MFC

Thread dans MFC [Visual C++] - Programmation

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 ?

Reply

Marsh Posté le 18-07-2001 à 13:59:17   

Reply

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...

Reply

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 ?

Reply

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...

Reply

Marsh Posté le 18-07-2001 à 19:06:52    

Ok, merci.
Je fais comment alors pour que mon script marche ?

Reply

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.

Reply

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.


---------------
[:seblamb] Moi aussi je veux grater dédé!!!
Reply

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.

Reply

Marsh Posté le 19-07-2001 à 13:35:14    

Merci guz,
tu peux me dire comment créer le pointeur, svp ?

Reply

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed