Thread et passage de struct

jlingenierie Messages postés 7 Date d'inscription mardi 20 avril 2004 Statut Membre Dernière intervention 12 mai 2004 - 10 mai 2004 à 17:26
cs_valoue Messages postés 72 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 13 mai 2011 - 18 juin 2004 à 13:56
Salut, j'essaye de faire une thread et de lui passer une structure en paramètre, j'ais compris comment faire pour passer un int , un char en parametre , mais une struct rien a faire , ca passe pas ....
Si kelkun pouvait donner un exemple, simple et clair ...avec l'utilisation des champs de la struc dans la thread ...
Merci d'avance.
@++

18 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 mai 2004 à 18:24
On ne passe pas une struct mais un pointeur sur une struct.

typedef struc _AAA {
int a;
int b;
} AAA;

AAA a;
a.a = 0;
a.b = 1;
hthrd = CreateThread(0, 0, FuncThrd, (void*) &a, 0, &dwthrd);

ciao...
BruNews, Admin CS, MVP Visual C++
0
jlingenierie Messages postés 7 Date d'inscription mardi 20 avril 2004 Statut Membre Dernière intervention 12 mai 2004
11 mai 2004 à 11:50
Merci, c'est bon, mon problème est régler :-)
0
cs_valoue Messages postés 72 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 13 mai 2011
18 juin 2004 à 09:13
Et lors de la reception du param dans ta méthode FuncThrd tu fais comment ??? Pourrais je voir le contenu de la méthode FuncThrd, au moins le cast et la recupération d'info de ta structure, stp ???

Où est declarée ta structure ??

J'ai les même soucis mais je n'arrive pas regler le pb !

Merci

Valoue
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 juin 2004 à 09:22
Declare ta struct ou tu voudras sauf sur la pile bien entendu sinon adresse invalide apres appel de CreateThread.

MASTRUCT mst;

DWORD WINAPI thrdProc(void *pprm)
{
MASTRUCT *pmst;
pmst = (MASTRUCT*) pprm;

// boulot thread ici

return 0;
}

ciao...
BruNews, Admin CS, MVP Visual C++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_valoue Messages postés 72 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 13 mai 2011
18 juin 2004 à 09:29
ça veut koi "sauf sur la pile" ??
Je l'ai dans mon .h, c bon ?

DWORD WINAPI thrdProc(void *pprm)
Dans cette declaration, g pas le type Void en param mais
DWORD WINAPI envoi(LPVOID sote){
...
}

c'est pas grave ???

Merci en tout cas !
Valoue
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 juin 2004 à 09:47
oui bien entendu dans le h c'est:
typedef struct _MASTRUCT {
// membres ici
} MASTRUCT;

par contre
MASTRUCT mst;
doit se trouver en variable globale.
Si est sur pile, declare dans une func qui est quittee avant fin du thread, adresse devient invalide, OK ?

ciao...
BruNews, Admin CS, MVP Visual C++
0
cs_valoue Messages postés 72 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 13 mai 2011
18 juin 2004 à 10:18
MErci bcp, ça marche.
Par contre, je suis obligée de declarer
typedef _mastruct{
...
} lastructure;
lastructure st;

en variable globale sinon, ça marche pas.

Sinon, en fait, je veut etre en mesure de renvoyer le contenu de la structure (remplie dans le thread) à la procedure appelante. Mais comment faire:

DWORD WINAPI recoit(LPVOID *sote){
LPTHREAD_PARAMS *stl;
stl = (LPTHREAD_PARAMS*)sote;
//je remplis un champs de la structure stl
//jusque là no pb, mais ensuite ça coince ...
(LPTHREAD_PARAMS *)sote = stl; //ça ça marche pas !!
}

Comment réaffecter le contenu mis a jour, pour pouvoir le recuperer dans la procédure appelante ???
Tu saurais comment faire stp?

merci pour tout !
Valoue
0
cs_valoue Messages postés 72 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 13 mai 2011
18 juin 2004 à 10:20
ça ça marche, est ce valide comme ecriture???

((LPTHREAD_PARAMS *)sote)->sock = stl->sock;
((LPTHREAD_PARAMS *)sote)->text = stl->text;

Valoue
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 juin 2004 à 10:28
du moment que tu as pointeur sur structure, tu modifies valeurs comme tu veux, chaque func qui s'en servira aura les nouvelles valeurs.
Tiens a toi de remplir avec des valeurs qui ne se perdent pas en route, toujours l'histoire des valeurs sur pile mais je pense que tu as saisi.

ciao...
BruNews, Admin CS, MVP Visual C++
0
cs_valoue Messages postés 72 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 13 mai 2011
18 juin 2004 à 11:12
Une derniere petite question, dsl ...

pour la creation de mon thread, j'appelle:

hthread=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) &recoit, (DWORD*)st, 0, &threadID);

sachant que st est

maStructure * st;

Dans cet appel, il faut koi "st" et pas "&st" ????????

il me dit que l'appel de envoi recoit un (void **) si je mets "st" dans l'appel (en 4ème param).
Du coup g une erreur LNK2019.

Que faut-il mettre ??

Merci pour tout !
Valoue
0
cs_valoue Messages postés 72 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 13 mai 2011
18 juin 2004 à 11:17
Je cois qu'en fait ça vient du fait que ma procedure "envoi" a l'en tete suivante:

DWORD WINAPI envoi(LPVOID *sote);

et que je l'appelle par:
hthread=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) &recoit, (DWORD*)st, 0, &threadID);

ce qui fait un (void**) pour l'appel, alors qu'on est obligé dans les threads d'appeler:
DWORD WINAPI uneFonctionThread(LPVOID *sote);

Comment faire ??!!

Valoue
0
cs_valoue Messages postés 72 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 13 mai 2011
18 juin 2004 à 11:19
Non je viens de comprendre ...
LPVOID est dejà un pointeur, ce qui fait que ça fait un void **...
aie aie aie !!!

Chui perdue !!!
Valoue
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 juin 2004 à 11:24
DWORD WINAPI envoi(LPVOID sote);

LPVOID equal void*

ciao...
BruNews, Admin CS, MVP Visual C++
0
cs_valoue Messages postés 72 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 13 mai 2011
18 juin 2004 à 11:46
G une erreur lors de l'edition des liens, et je ne comprends pas pourkoi:

CommunicationClient error LNK2019: symbole externe non résolu "public: static unsigned long __stdcall CcomEthernet::recoit(void *)" (?recoit@CcomEthernet@@SGKPAX@Z) référencé dans la fonction "public: void __thiscall CcomEthernet::recoitTrame(char *)" (?recoitTrame@CcomEthernet@@QAEXPAD@Z).

Pourtant, ma methode du thread est:
static DWORD WINAPI envoi(LPVOID sote){
...
return 0;
}

et l'appel se fait depuis:
hthread=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) &recoit, (DWORD*)&st, 0, &threadID);

et sachant que st est de type:
mastructure st;

je ne comprends rien du tout ! je ne vois pas pourkoi il n'arrive pas a faire l'edition des liens ?

Valoue
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 juin 2004 à 11:54
est bien marquee 'static' partout ? devrait compiler.

ciao...
BruNews, Admin CS, MVP Visual C++
0
cs_valoue Messages postés 72 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 13 mai 2011
18 juin 2004 à 12:01
ben en fait, l'en tete de la definition de "envoi" dans le .h et le .cpp est la meme, avec static.
C'est ça dont tu me parles ??

Ou partout signifie a toutes les fonctions ?

Valoue
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 juin 2004 à 12:15
je disais 'static' pour la func de thread quand est declaree dans une classe.

bah si pose prob, tu la sors de la classe et tu mets dans le cpp qui s'en sert, devrait regler le prob. Faut bien sur que n'ait pas besoin de toucher des membres de classe.

ciao...
BruNews, Admin CS, MVP Visual C++
0
cs_valoue Messages postés 72 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 13 mai 2011
18 juin 2004 à 13:56
J'ai trouvé d'où venait l'erreur:

En fait je declarait l'en tete de la fonction de thread dans le .h (en static) et la definition (avec le meme en tete static aussi) dans le .cpp.

Et bien, g supprimé l'en tete dans le fichier .h, et plus de pb a l'edition des liens !

Voilà, je voulais donner la solution au cas où ça interesserait quelqu'un !!

Merci pour tout !!
Valoue
0
Rejoignez-nous