[MFC] multithread, communication père<->fils
Bonjour,
J'ai une application qui fonctionne actuellement en monothread et j'aimerai la passer en multithread. Mon application permet d'analyser un lot d'images. L'interface que j'ai conçu sous visual permet à l'utilisateur de choisir le nombre de thread qu'il souhaite lancer (chaque thread effectuant plusieurs traitement sur une image). j'aimerai initialement lancer le nombre de thread precisé par l'utilisateur simultanement sur des images differentes. Ensuite, dès qu'un thread à terminé de traiter son image, j'aimerai le quitter pour ensuite le lancer (ou en lancer un nouveau) sur l'image qui suit.
Voila pour le principe (j'espere que vous avez compris).
Plusieurs problèmes se posent :
- - Tout d'abord, seul le père à la liste des images à traiter, il doit donc communiquer à chaque thread qu'il execute, l'image qu'il doit traiter.
- Ensuite, le thread doit faire un resumer des resultats qu'il a obtenu pour le transmettre au père.
Faut-il commencer par faire quelque chose comme ça? :
Citation:
for (int i=0; i<nb_thread_a_lancer; i++)
{
AfxBeginThread( processOneImage, this);
}
sachant que "processOneImage" est une fonction qui traite une image.
Merci pour votre aide et vos conseils.
Re: [MFC] multithread, communication père<->fils
Citation:
Envoyé par Joeleclems
chaque thread effectuant plusieurs traitement sur une image
8O tu veux dire que plusieurs threads vont modifer simultanément le même fichier??!
Citation:
Envoyé par Joeleclems
Code:
1 2 3 4
| for (int i=0; i<nb_thread_a_lancer; i++)
{
AfxBeginThread( processOneImage, this);
} |
Il me semble que AfxBeginThread retourne d'Id du thread. Tu peux donc créer un tableau (m_aThreadIds dans le code ci-dessous) dans lequel tu enregistre les Ids de tes threads (ça peut être pratique pour garder un contrôle sur eux, pour les arêter par exemple):
Code:
1 2 3 4
| for (int i=0; i<nb_thread_a_lancer; i++)
{
m_aThreadIds[i] = AfxBeginThread( processOneImage, this);
} |
hope it helps
Re: [MFC] multithread, communication père<->fils
Bonjour,
Citation:
Envoyé par Joeleclems
Bonjour,
... L'interface que j'ai conçu sous visual permet à l'utilisateur de choisir le nombre de thread qu'il souhaite lancer (chaque thread effectuant plusieurs traitement sur une image). j'aimerai initialement lancer le nombre de thread precisé par l'utilisateur simultanement sur des images differentes.
Donc, ici tu as besoin d'un thread par images à traiter, attention cependant, sur Windows le nombre de thread par processus n'est pas illimité non plus !
Citation:
Envoyé par Joeleclems
Ensuite, dès qu'un thread à terminé de traiter son image, j'aimerai le quitter pour ensuite le lancer (ou en lancer un nouveau) sur l'image qui suit.
Il n'est pas besoin de le quitter mais de le suspendre !
Première solution: Dans la boucle de traitement du thread, tu émets un evènement lorsque le thread a terminé son image, puis il se suspend. L'application "chapeau" recevant cet évènement, lui envoit un évènement de réveil avec comme paramètre un handle sur le nouveau fichier image à traiter.
En gros, c'est l'application "chapeau" qui ouvre le fichier image.
Autre solution, comme j'en ai l'habitude, je dirais plus facile, car elle ne dépend pas de la MessagePump, utiliser une zone de mémoire partagée dans laquelle l'application chapeau place les noms de fichiers à traiter comme une fifo.
Le thread lorsuq'il commence un traitement va lire l'emplacement qui lui est réservé, ouvre l'image et la traite. Une fois le traitement intégralement terminé, il met à null, ou à une valeur identifié comme "Worked" la chaîne de traitement dans la fifo. Il se suspend.
L'application place alors un nouveau nom de fichier à traiter à cet emplacement, puis elle réveille le thread.
Citation:
Envoyé par Joeleclems
- Tout d'abord, seul le père à la liste des images à traiter, il doit donc communiquer à chaque thread qu'il execute, l'image qu'il doit traiter.
- Ensuite, le thread doit faire un resumer des resultats qu'il a obtenu pour le transmettre au père.
Une zone partégée me parait trés appropriée à ton problème.
Regarde l'aide de CreateFileMapping, CreateViewOfFile ...
Citation:
Envoyé par Joeleclems
Faut-il commencer par faire quelque chose comme ça? :
Code:
1 2 3 4 5
|
for (int i=0; i<nb_thread_a_lancer; i++)
{
AfxBeginThread( processOneImage, this);
} |
Oui, uniquement si tu utilises une classe de thread MFC comme CThread.
Attention cependant, l'application principale doit garantir de ne pas donner une même image à deux thread.