Questions sur les applications multithread (dépendance des threads)

[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 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?




 

15 réponses

Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
7
Salut
Tu peux utiliser la fonction PostThreadMessage() pour envoyer des message aux threads
A+

____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
salut, tu peux m'expliquer un peu son fonctionnement STP?
merci pour l'info.


 
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
7
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.

A+

____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
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?


 
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
7
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)

A+

____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
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?

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


 
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
7
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.)

A+

____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
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!


 
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
7
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...

A+


____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
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.


 
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
7
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.

Comme ca 0 conflit...

A+


____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
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à


 
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
7
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.)

A+

____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
Ok, très bien.
Je te remercie.

A+