LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 2013
-
27 janv. 2010 à 12:00
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 2013
-
27 janv. 2010 à 15:15
Bonjour,
Je me pose quelque questions avant le développement d'une application multithread.
Je n'ai que très peu de connaissances sur ce sujet, je le précise!
Donc imaginons une appli avec 3 threads : 1 thread principal qui tourne en boucle, et 2 autres threads dédié à la communication (1pour SQL et 1 com TCP/IP avec un autre PC)
les thread 2 et 3 "alimentent" le thread 1 en données.
Mon problème est là : comment garder une indépendance des threads, tout en faisant en sorte qu'ils soient lié: par exemple le thread 3 reçoit un message d'un autre PC via TCP/IP et ce message doit déclenché une action donc appeler une fonction du thread 1?
j'ai imaginer utiliser des booléens communs a tout le code: le thread 3 met ce booléen a true , et dans la boucle principale du thread 1 il vérifie ce même booleén et si true appelle les fonctions correspondantes, pusi le remet à false... mais ça sent un peu le bidouillage, non?
A voir également:
Questions sur les applications multithread (dépendance des threads)
Pistol_Pete
Messages postés1054Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 27 janv. 2010 à 13:30
Reprenons ton exemple:
"Le thread 3 reçoit un message d'un autre PC via TCP/IP ", dès qu'il recoit ce message, il va appeler la fonction PostThreadMessage() avec comme identifiant l'id du thread principal.
Donc ton thread principale (celui qui ne fait qu'attendre les messages) va recevoir ce message et tu pourras déclencher une action approprié.
Pour plus d'info cf msdn.
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 27 janv. 2010 à 13:36
Ok merci, entre temps j'ai lu quelques exemples sur ce site et autre...
Ca serait parfait si mon thread principal était en attente de messages des autres threads, mais en fait mon thread principal doit non seulement rester à l'écoute des autres threads mais aussi tourner en boucle sur d'autres fonctions de bases...
comment m'y prendre?
dois je diviseer mon thread principal en plusieurs thread?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Pistol_Pete
Messages postés1054Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 27 janv. 2010 à 13:43
Ce n'est pas un problème. Utilise la fonction PeekMessage(). Elle te permet de vérifier si un thread a envoyé un message et si aucun message n'est envoyé elle rend la main et tu pourras exécuter tes fonctions de base. (Si tu veux vraiment attendre un message c'est la fonction GetMessage() qu'il faut utiliser. GetMessage() est bloquante)
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 27 janv. 2010 à 13:49
Ok, donc j'utilise PeekMessage pour ne aps bloquer mon thread principal, c'est bon à savoir, mais imaginons que je reçoive consécutivement un message du thread 2 et du thread 3, un seul sera traité? je perdrais le second message, non?
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 27 janv. 2010 à 14:03
Et aussi, si je veux utiliser dans mon thread 1 des données du thread 2 , je dois forcément utiliser des avriables globales? (ce qui me fait peur c'est un dysfonctionnement dans ce cas là) si les 2 threads accèdent en même temps à ces variables...
En tout cas merci pour ton aide!
Pistol_Pete
Messages postés1054Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 27 janv. 2010 à 14:07
Non les messages sont empilés. PeekMessage ne fait que lire le premier message. S'il y en a deux dans la file le premier appel à PeekMessage dépilera celui du thread 2 et le second appel celui du thread 3.
Il faut juste s'assurer d'appeler souvent PeekMessage (par exemple à chaque fois que tu as fini ton traitement de base.)
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 27 janv. 2010 à 14:10
Niquel, déjà un soucis en moins.
Pour mon problème de variables globales, je pensais à utiliser SQL Server Express en intermédiaire, ce qui permettrait en plus une sauvegarde des messages reçus.
t'en penses quoi?
en tout cas merci, coté théorique ça semble clair dans ma tête ya plus qu'à se mettre à la pratique!
Pistol_Pete
Messages postés1054Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 27 janv. 2010 à 14:23
Je suis pas sur d'avoir bien compris ta dernière remarque. Mais effectivement, si tu veux faire un historique, tu peux générer une requête SQL ou bien juste écrire dans un fichier txt...
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 27 janv. 2010 à 14:26
Pour le problème des variables globales, si je prends toujours comme exemple : le thread 2 reçoit par TCP/IP un message avec des données venant d'un autre PC/Utilisateur.
il va donc alerter le thread1 via PostThreadMessage, mais le thread 1 va avoir besoin des données (TCP/IP) reçues du thread2... et c'est la le conflit dont j'ai peur.
Pistol_Pete
Messages postés1054Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 27 janv. 2010 à 14:34
D'accord je comprend mieux..
On peut faire des choses pour supprimer les conflis...
Imaginons que le thread 2 recoit des données (TCP/IP). Le thread 2 va allouer de la mémoire (une structure, un objet, c'est comme tu veux) et y copier les données qu'il a reçu. Une fois la recopie terminé, il envoie un message au thread 1 via PostThreadMessage avec comme lParam l'adresse de ta structure ou de ton objet.
Le thread 1 reçoit le message + un pointeur sur les données. Une fois qu'il n'a plus besoin des données, il peut détruire la mémoire alloué par le thread 2.
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 27 janv. 2010 à 14:40
Merci, super, ça fait plaisir que t'ai de suite compris.
Perso, je compte utiliser des structures(ex: struct), donc j'y copie mes données entrantes, je passe en Lparam un &struct, et puis hop ça marche!
par contre coté destruction de mémoire allouée, je vois pas trop là
Pistol_Pete
Messages postés1054Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 27 janv. 2010 à 14:55
Il faut que ton thread 2 face un new ou un malloc quand tu crées ta structure.
Le thread 1 fera un delete ou un free pour libérer la mémoire alloué. (fait des recherche sur l'allocation de la mémoire dynamique pour mieux comprendre.)