Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
5224 connectés 

 


Dernière réponse
Sujet : [Visual C++] Thread dans MFC
Guz 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.

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
Guz 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.
antsite Merci guz,
tu peux me dire comment créer le pointeur, svp ?
Guz 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.
seblamb 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.
BENB

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.

antsite Ok, merci.
Je fais comment alors pour que mon script marche ?
BENB 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...
antsite 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 ?
BENB 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...
antsite 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 ?

Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)