Récupèrer une structure avec PostThreadMessage et Peekmessage

Résolu
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 - 11 févr. 2010 à 15:16
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 - 12 févr. 2010 à 11:25
Bonjour,

Je cherche à faire communiquer 2 threads ensemble, on ma conseillé sur ce site les fonctions Postthreadmessage et Peekmessage et effectivement cela correspond tout à fait à mes attentes
cependant lorsque j'essaye de faire passer des paramètres je rencontres quelques soucis(du a ma méconnaissance des lparam et wparam)
en gros si j'envoi un int comme ceci:
int test =99;
PostThreadMessage(HandleMainThread,MSG_1,0,(LPARAM)test);

je reçois bien 99 dans msg.lparam

mais je ne sais aps comment faire pour passer toutes une structure style
struct test{
int toto
float tata
bool titi
}
ni pour passer plusieurs variables(indépendantes)

merci de m'aider à mieux comprendre le fonctionnement!



 

7 réponses

BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
11 févr. 2010 à 15:48
Une possibilité:
Fais un VirtualAlloc, tu remplis cette adresse des données de ta struct, passe cette adresse en LPARAM au thread qui fera le VirtualFree quand fini de s'en servir.

ciao...
BruNews, MVP VC++
3
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
11 févr. 2010 à 16:06
Ok, merci je vais regarder du coté de ces fonctions (que je découvre)

je reviens si problème.



 
0
Pistol_Pete Messages postés 1054 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
11 févr. 2010 à 16:07
Salut
Que ce passe t'il si on fait un un malloc ou un new à la place d'un VirtualAlloc?


____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
11 févr. 2010 à 17:54
Je n'utilise jamais de CRT mais devrait aller.
VirtualAlloc garantit l'alignement sur taille de page system, soit 4 Ko donc ALIGN 16 au mini. C'est ce qui convient impec si on doit transmettre des données pour calculs par SSE2 ou sup.

ciao...
BruNews, MVP VC++
0

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

Posez votre question
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
12 févr. 2010 à 10:45
Ok, merci ça semble marchait.
Juste pour infos, si je veux faire passer plusieurs variables mais qui ne sont pas dans la même structure, comment faire avec un seul "lparam" ?

 
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
12 févr. 2010 à 11:19
Par force le destinataire doit connaitre ce qu'il attend, sinon possible mais il faudrait au début du bloc mémoire un header définissant ce qui suit.
pmem = (BYTE*) VirtualAlloc(0, LEN, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

On met dedans une struct DATA et 2 DWORDs:
memcpy(pmem, myData, sizeof(DATA));
*((DWORD*) (pmem + sizeof(DATA)) = dw1;
*((DWORD*) (pmem + sizeof(DATA) + 4) = dw2;

En C tout est permis, la seule limitation est dans le crane.

ciao...
BruNews, MVP VC++
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
12 févr. 2010 à 11:25
Merci, effectivement c'est une bonne astuce.

j'aime bien ta conclusion, mais encore faut-il de solides connaissances.


 
0