Conflit Parallel.ForEach et Threads
Bonjour,
Je développe un logiciel qui est interfacé avec un capteur laser. Celui-ci m'envoie la distance entre le capteur et l'objet qui se situe devant lui. Il travaille à 2000Hz. Je communique avec lui à travers une API fournit.
Pour faire simple, j'ai créé une thread qui est en interface avec ce capteur. Les trames reçues sont mises dans une Queue pour traiter aussi vite que possible et ne pas perdre de trame. Ensuite, une autre Thread vient prendre les trames et les décoder.
Pour un objet donné, je constitue un ensemble de points mesurés avec le capteur. Je fais ensuite des calculs sur cet ensemble de points.
Dans le module de calcul, pour améliorer les performances j'ai utilisé un Parallel.ForEach(). Cela fonctionne bien et j'ai amélioré mes temps de calcul.
Tout va bien tant que je fonctionne par étapes : 1) mesure d'un objet puis 2) calcul sur les points obtenus.
Pour encore gagner en productivité, j'aimerai : mesuré la pièce "n+1" pendant que je calcule la pièce "n". Et là, les problèmes commencent. J'ai régulièrement des pertes de trames. J'en conclu qu'il y a un conflit entre la fonction Parallel.ForEach() et les Threads d'acquisition de points.
Qu'en pensez-vous ? Comment améliorez les choses ?
J'ai essayé de mettre les Threads dans une priorité plus haute, voir même critique. Soit je n'ai pas réussi, soit ca ne fonctionne pas ...
On n'est jamais assez précis ....
Bonjour,
Comme quoi, on n'est jamais assez précis dans les explications ...
Le Parallel.ForEach() travaille sur les données acquises à la pièce précédente. Donc il ne fait pas de lock sur la Queue de réception. Il travaille vraiment dans un module à part.
Mon sentiment, si j'ai bien compris, le Parallel.ForEach() permet d'utiliser en parallèle plusieurs CPU pour faire des choses. Je me demande si il ne "s'accapare" le temps CPU pour lui, et du coup, les Threads qui ont besoin aussi de temps ne sont pas "activées". Est-ce comme cela que ca fonctionne ? quelle est la priorité d'execution entre une thread et un Parallel.ForEach ?