Bonjour,
je fais mon premier programme utilisant le multi-threading sous windows.
J'ai un thread principal et un thread secondaire créé avec CreateThread() qui tourne en permanence avec une boucle while().
J'ai besoin de faire en sorte que mon thread principale appelle une fonction d'une classe instancié dans le thread secondaire (qui modifie des états de cette classe).
Je peux utiliser pour cela la fonction PostThreadMessage() et faire executer la fonction désirée par le second thread à la réception du message.
Mais mon problème, c'est que mon thread principal a besoin d'être certain que la fonction du thread secondaire a bien été executé avant dans continuer son exécution (il doit attendre).
La seul solution que j'ai trouvé c'est quelque chose comme ci-dessous. Mais j'ai pas l'impression que ce soit la meilleur (surtout à cause du while de FonctionThreadPrincipal() si aucun message de retour n'est capté)
Dans mon thread principal:
Dans mon thread secondaire:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 void FonctionThreadPrincipal(int variable1, int variable2) { UINT msgSend = MESSAGE_PERSO; FONCTIONDESC* desc = new FONCTIONDESC(); desc->variable1 = variable1; desc->variable2 = variable2; WPARAM wParamSend = (WPARAM)desc; LPARAM lParamSend = (LPARAM)0; PostThreadMessage(m_ThreadSecondaireId,msgSend,wParamSend,lParamSend); // on attend MSG msgFeedBak; while(PeekMessage(&msgFeedBak,NULL,MESSAGE_PERSO,MESSAGE_PERSO,PM_REMOVE) == FALSE) { ; // on fait rien } // Ok on peut continuer. }
Qu'est ce que je dois faire ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 while( runProcess ) { if( PeekMessage(&msg,NULL,MESSAGE_PERSO,MESSAGE_PERSO,PM_REMOVE) == TRUE ) { switch(msg.message) { case MESSAGE_PERSO: FONCTIONDESC* desc = (FONCTIONDESC*)msg.lParam; m_MonInstance->MaFonction( desc->variable1 ,desc->variable2); delete desc; // feedback UINT msgSend = MESSAGE_PERSO; WPARAM wParamSend = 0; LPARAM lParamSend = 0; PostThreadMessage(m_CallerThreadId,msgSend,wParamSend,lParamSend); break; }; } update(); }
Partager