OVH Cloud OVH Cloud

Thread exception

3 réponses
Avatar
Ben
Bon j'ai un probleme simple mais complique a resoudre.
J'ai 2 threads qui tournent au meme moment en parallele. Dans les 2 threads
je gere les exceptions a l'aide d'un try-catch. Mon probleme est que je
voudrais, lorsque l'un des threads genere un certain type d'exception, que
les deuxieme thread genere lui aussi instantanement une exception
specifique. Mais impossible d'arriver a mes fins. Si quelqu'un a la
solution.

Merci d'avance.

3 réponses

Avatar
adebaene
"Ben" wrote in message news:<3f603625$0$13301$...
Bon j'ai un probleme simple mais complique a resoudre.
J'ai 2 threads qui tournent au meme moment en parallele. Dans les 2 threads
je gere les exceptions a l'aide d'un try-catch. Mon probleme est que je
voudrais, lorsque l'un des threads genere un certain type d'exception, que
les deuxieme thread genere lui aussi instantanement une exception
specifique. Mais impossible d'arriver a mes fins. Si quelqu'un a la
solution.



Ce n'est pas possible : Par définition, une exception est liée à la
pile d'exécution, donc à un thread spécifique. Le mieux que tu puisse
faire, c'est, dans le catch du thread qui a lancé l'exception,
positionner de manière atomique un flag qui est testé régulièrment par
l'autre thread, mais tu n'obtiendra pas de simultanéité.

Je suis sceptiqe sur l'utilité du truc : qu'est-ce que tu ferais, dans
le thread qiu n'a pas levé initialement l'exception, d'une exception
sans aucun rapport avec le contexte d'exécution courant? C'est quoi
l'objectif?

Arnaud
Avatar
Ben
"Arnaud Debaene" wrote in message
news:
"Ben" wrote in message


news:<3f603625$0$13301$...
Bon j'ai un probleme simple mais complique a resoudre.
J'ai 2 threads qui tournent au meme moment en parallele. Dans les 2


threads
je gere les exceptions a l'aide d'un try-catch. Mon probleme est que je
voudrais, lorsque l'un des threads genere un certain type d'exception, que
les deuxieme thread genere lui aussi instantanement une exception
specifique. Mais impossible d'arriver a mes fins. Si quelqu'un a la
solution.

Ce n'est pas possible : Par définition, une exception est liée à la
pile d'exécution, donc à un thread spécifique. Le mieux que tu puisse
faire, c'est, dans le catch du thread qui a lancé l'exception,
positionner de manière atomique un flag qui est testé régulièrment par
l'autre thread, mais tu n'obtiendra pas de simultanéité.



Ouais c'est bien ca le problem il me faut de la simultaneite ou
"quasi-simultaneite"..

Je suis sceptiqe sur l'utilité du truc : qu'est-ce que tu ferais, dans
le thread qiu n'a pas levé initialement l'exception, d'une exception
sans aucun rapport avec le contexte d'exécution courant? C'est quoi
l'objectif?

Arnaud



Le probleme il est simple : J'ai un thread qui controlle un hardware et qui
a besoin de tourner rapidement pour stocker les infos issues de cet
hardware. J'ai un autre thread qui a acces a ces infos et qui les utilise et
les manipule. Il se peut que mon premier thread genere une exception
(probleme materiel ou autre) et dans ce cas en fonction de l'exception
genere je dois rapidement stopper mon deuxieme thread (dont le
fonctionnement depend grandement du fonctionnement du premier).

Il y a peut-etre une autre possibilite mais je ne sais pas si c'est
faisable. Peut-on a partir d'un thread forcer un autre thread a genere une
exception. Un peu comme TerminateThread mais au lieu de preciser un code
d'erreur et terminer le thread on preciserait une exception et le thread se
terminerait?
Avatar
Arnaud Debaene
Ben wrote:

Le probleme il est simple : J'ai un thread qui controlle un hardware
et qui a besoin de tourner rapidement pour stocker les infos issues
de cet hardware. J'ai un autre thread qui a acces a ces infos et qui
les utilise et les manipule. Il se peut que mon premier thread genere
une exception (probleme materiel ou autre) et dans ce cas en fonction
de l'exception genere je dois rapidement stopper mon deuxieme thread
(dont le fonctionnement depend grandement du fonctionnement du
premier).

Il y a peut-etre une autre possibilite mais je ne sais pas si c'est
faisable. Peut-on a partir d'un thread forcer un autre thread a
genere une exception. Un peu comme TerminateThread mais au lieu de
preciser un code d'erreur et terminer le thread on preciserait une
exception et le thread se terminerait?


C'est peut être faisable avec une APC (cf QueueUserAPC) , mais il y a
beaucoup plus simple :

- A côté de ta zone de stockage des données d'acquisition partagées entre
les 2 threads, tu mets un bool "acquisition_ok" initialement à false. Tu
protèges cette variable contre les accès concurrents par le même mutex (ou
section critique) que ta zone pour les données d'acquisistion.

- S'il y a une erreur hardware, ton thread d'acquisition positionnne cette
variable au lieu d'écrire les nouvelles données acquises.

- Le thread de traitement, à chaque tour de boucle, vérifie l'état de ce
flag. S'il est positionné, il gère l'erreur (en lancant une exception si
nécessaire, à toi de voir). Sinon, il extrait les prochaines données et les
traite normalement.

Arnaud