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

  FORUM HardWare.fr
  Programmation

  [Visual C++] Thread dans MFC

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Visual C++] Thread dans MFC

n°47552
antsite
Je me souviens
Posté le 18-07-2001 à 13:59:17  profilanswer
 

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 ?

mood
Publicité
Posté le 18-07-2001 à 13:59:17  profilanswer
 

n°47576
BENB
100% Lux.
Posté le 18-07-2001 à 15:14:05  profilanswer
 

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

n°47607
antsite
Je me souviens
Posté le 18-07-2001 à 16:11:13  profilanswer
 

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 ?

n°47628
BENB
100% Lux.
Posté le 18-07-2001 à 16:53:43  profilanswer
 

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

n°47674
antsite
Je me souviens
Posté le 18-07-2001 à 19:06:52  profilanswer
 

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

n°47742
BENB
100% Lux.
Posté le 19-07-2001 à 09:32:14  profilanswer
 

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.

n°47776
seblamb
Posté le 19-07-2001 à 10:34:04  profilanswer
 

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é!!!
n°47835
Guz
Posté le 19-07-2001 à 12:58:43  profilanswer
 

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.

n°47840
antsite
Je me souviens
Posté le 19-07-2001 à 13:35:14  profilanswer
 

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

n°47848
Guz
Posté le 19-07-2001 à 14:01:12  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  [Visual C++] Thread dans MFC

 

Sujets relatifs
SQL et visual basiccomment recuperer le resultat d'une requete SQL en visual basic???
Ca vaut le coup d'acheter Visual C++ 6 standard?Visual Basic 6 ??!!
Problème compilation Visual C++MFC : un bon site pour débuter.
Ou trouver Microsoft Visual C++?[Visual C++ 6]Base SQL
[MFC] Problème avec le pinceau[Visual C++] Pourquoi More Styles > Visible ne marche pas ?
Plus de sujets relatifs à : [Visual C++] Thread dans MFC


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR