Bonsoir les gens
Je suis en train d'intégrer du code C++ (MFC, avec des threads, des exceptions, toussa) au logiciel de calcul IDL (tiens au passage j'ai vu personne en parler dans le sujet-à-softs-qui-font-des-calculs).
IDL propose un moyen de linker des routines en C++, du moment qu'elle sont déclarées comme il faut dans une DLL à placer dans le répertoire d'IDL.
Ca, je sais faire.
Problème : IDL n'aime pas les threads. Suffit de faire le moindre CreateThread() ou équivalent pour que le bazar se retrouve bloqué. Sauf que le code que je veux intégrer à IDL, il est tout plein de threads (et que j'ai pas envie de tout me retaper).
Solution actuelle : La DLL de fonctions IDL ne contient que du code qui vérifie la validité des arguments recus, formate tout ca dans une jolie commande et envoie le tout via sockets à un programme séparé (qui donc lui peut se permettre de balancer des threads comme il veut
).
Jusque la, tout baigne.
J'ai fait ce qu'il fallait pour que si une exception C++ arrivait dans le code de la DLL (qui rappellons le se contente de transmettre la demande au processus de calcul), cette erreur soit reportée sous IDL en utilisant le système de gestion d'erreur de IDL.
(un
throw exception("coucou" ) ; |
dans le code de la DLL provoque une exception IDL
).
Sauf que ca marche que pour les exceptions lancées dans le code de la DLL (qui finalement ne fait pas grand chose).
J'aurais bien voulu qu'IDL puisse récupérer les exceptions lancées dans le code utile (celui qui se trouve, pour ceux qui n'ont pas suivi, dans un processus séparé avec lequel IDL communique via sockets).
Pour cela, je me suis démerdé à faire une magouille avec les sockets : quand le code utile lance une exception, le code de transfert réseau (qui récupère les commandes arrivant depuis IDL et qui lance les calculs demandés) la chope, flingue la connexion, et le code de la DLL (qui s'était connecté et espérait gentilment qu'en face on ne le jetterait pas comme ca) essaie une nouvelle connexion en demandant "mais pourquoi tu m'a jetté". Et la on lui répond la description de l'exception (que l'on avait préalablement mémorisée).
Soit.
Ca a l'air de fonctionner.
Mais c'est lourd.
J'en ai marre de me taper masse code réseau, gérer plein de trucs toussa juste parceque je veux :
invoquer une procédure distante et récupérer ou la valeur renvoyée, ou l'exception lancée. Le tout via réseau (ou autre si vous avez quelque chose à proposer)
La question (bah ouaip parcequ'il y a une question, sinon j'me (et vous) ferait pas chier à vous raconter tout ca) :
Ca existerait pas déja une bibliothèque toute faite qui puisse faire ce que je me casse la tête à faire tout seul ? (sachant que le but c'est pas seulement d'invoquer et de récupérer le résultat du type attendu, je voudrais aussi récupérer les exceptions lancées...)