Récupèrer une structure avec PostThreadMessage et Peekmessage [Résolu]

Signaler
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
-
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
-
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

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
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++
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
Ok, merci je vais regarder du coté de ces fonctions (que je découvre)

je reviens si problème.



 
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
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.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
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++
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
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" ?

 
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
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++
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
Merci, effectivement c'est une bonne astuce.

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