IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Exception generee dans librairie C


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 9
    Par défaut Exception generee dans librairie C
    Bonjour,

    J'ai fait une recherche dans le forum avant de poser la question mais je n'ai rien trouvé.

    En fait, j'essaie d'utiliser dans du code C++ une librairie C. Jusque là aucun souci. Le truc c'est que l'appel à une fonction de cette librairie ne doit pas durer indéfiniment. C'est à dire qu'un temps maximal est autorisé. Au-delà de ce temps, cette fonction doit s'arreter.

    J'ai donc "encapsuler" l'appel dans un try { } catch {} avec un timer_create et timer_settime pour generer l'exception.
    Si le code à l'intérieur du try {} est du C++, j'attrape bien l'exception. Tout se déroule comme prévu. Par contre si j'utilise la librairie C, le binaire crashe au lieu de reprendre le code à partir du catch {}.
    J'en ai déduit que le problème venait de la prise en compte de l'exception par le C, ce qui est somme toute assez logique. Je n'ai par contre pas trop d'idée afin de régler ce souci. Quelqu'un en a une ?

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Je ne connais pas trop les fonctions timer que tu utilises, ni sous quel OS, mais j'ai du mal à voir comment c'est sensé marcher. Dans les systèmes de timer que je connais :
    - Soit ton timer poste un message vers le process, mais pendant l'appel à la fonction, le process ne lira pas les messages...
    - Soit le timer déclenche l'appel d'une fonction dans un thread crée pour, et dans ce cas, je ne vois pas comment l'exception pourrait se propager au thread qui t'intéresse...
    - Soit le timer provoque une interruption, et sortir d'une interruption par une excption n'est généralement pas possible...

    Pour ton problème, je partirais plus dans l'idée de lancer la fonction dans un thread à part, et dans le thread principal d'attendre soit la fin du thread de calcul, soit l'expiration du timer. Ensuite, tu peux décider soit de tuer le thread s'il n'a pas donné de résultats (avec les risques que ça comporte), soit de le laisser tourner dans le vide.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    J'avais posé la même question il y a quelques mois...

    ->http://www.developpez.net/forums/sho...9&postcount=15

    Il semblerait que sous Windows il y aie une solution, sinon c'est dur, très dur...

  4. #4
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 9
    Par défaut
    C'est pour du code sous Linux...... malheureusement apparemment

  5. #5
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Si tu es sous Linux, il est vraisemblable que ton timer genere un signal et donc que tu lances une exception. Comme Loic, il ne me semblait pas possible de faire cela. Mais si ca marche avec du C++, essaie de compiler le C avec l'option -fexceptions, il y a des chances pour que ca marche avec la meme definition de marcher que celle que tu utilises pour le C++.

  6. #6
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut
    Salut,

    J'ai été confronté à ce type de probléme et ma solution vaut ce quelle vaut, pas trés élégant, mais ca fonctionne.

    Dans ma routine en c que je veux stopper, je fait un log(0); ca génére une excpetion mamthématique.
    dans mon programme C++ j'intercepte les excpetions mathematique avec la fonctions : int _matherr (struct _exception *a) { .... }
    Dans cette focntion je regénere une exception cette fois classique que j'intercept dans mon code en C++.

    Tordu , je vous l'accorde, mais ca marche superbien.

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par uriotcea Voir le message
    Dans ma routine en c que je veux stopper, je fait un log(0); ca génére une excpetion mamthématique.
    Des erreurs mathématiques ne devraient pas générer d'exception (un signal oui, mais il est déjà dans un signal!). C'est une extension MS sans intérêt pour lui.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Le problème, c'est que tu cherches à contrôler une fonction qui ne te donne pas de moyen de la contrôler. A partir de là, tu entres dans le royaume joyeux du hack et nul n'en ressort indemne.

    J'irais avec la solution de JolyLoic, qui propose de lancer la fonction dans un thread, et si tu n'as pas reçu la réponse en un temps donné, tu lâches le thread dans la nature et tu continues ton exécution. Par contre, tuer un thread n'est pas pour ceux qui ont les reins fragiles, et si ton thread ne se termine pas de lui-même, tu as un problème: tu pourras relancer la procédure un certain nombre de fois, mais tu laisseras traîner un thread rebelle à chaque fois, et un beau jour le système ne voudra plus en créer.

    Bonne chance!

    Carl

  9. #9
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Je plussoie 5hdumatin.
    Le problème est que tu as une fonction bien pourrie à utiliser... A partir de là, les problèmes commençent... Je vois deux "solutions":
    1. Mettre les mains dans le code de la librairie, avec les risques que ça comporte (bugs etc... à ne jamais faire normalement)
    2. Exécuter dans un thread et le laisser tourner le pauvre.


    D'ailleurs, y'a pas moyen de spécifier une priorité au thread? En mettant une priorité basse, ça éviterait de bloquer le programme pour la suite ?

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Dites, pour moi si on tue le thread il disparait, il ne tourne plus. Donc il n'y a pas de problème au niveau de l'occupation processeur ou du nombre de threads dans le système. Le problème est qu'il n'aura pas eu l'occasion de faire tout un tas de choses nottament:
    - libérer la mémoire allouée
    - fermer des fichiers
    - fermer des ports pour connexions réseaux
    - et cetera
    ce qui est toujours un peu moins grave mais quand même pas joli joli.

    Pour faire simple, le biblio que tu veux utiliser ne convient tout simplement pas pour ce que tu veux faire. Je vais décréter des évidences mais il semblerait que ce soit nécessaire, si tu n'es pas un programmeur complètement bourrin qui se fout de la qualité de son travail tu as quatre solutions:
    - ne pas faire comme ça
    - chercher une bibliothèque qui soit appropriée pour ce que tu veux faire
    - coder toi même la fonction dont tu as besoin, mais de façon à ce qu'on puisse lui demander de s'arreter proprement
    - éventuellement créer un fork de la bibliothèque que tu comptais utiliser en ajoutant la fonctionnalité qui te manque
    Et non on ne peut pas bricoler un truc à la va vite, il n'est pas nécessaire de se pencher sur ce problème pendant des heures pour se rendre compte que tout ce qu'on pourra imaginer est et restera de la merde.

  11. #11
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Une question qui se pose est de savoir si les dépassements de temps vont arriver régulièrement, ou de manière exceptionnelle. Sont-ils juste le signe d'un calcul trop long dans un contexte temps réel, ou bien le signe d'un plantage de l'algorithme ? La solution peut dépendre de ces critères.

    Si le calcul n'est pas lancé trop souvent, et qu'on peut se permettre le coût associé, lancer carrément le calcul dans un process séparé peut simplifier le nettoyage lors d'un kill, l'OS s'en occupant.

    Autrement, puisque tu as l'air d'être sous unix, si j'ai bien compris, les fonctions qui demandent à un thread de se tuer permettent dans le thread en question de récupérer la main pour faire du ménage, du moins dans un environnement C (je ne crois pas que l'effet sur les destructeurs soit spécifié, mais il n'est pas impossible d'avoir une bonne surprise sur le sujet). Mais je n'en sais pas plus.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. [Forms6] Variable global dans librairie
    Par Nargel33 dans le forum Forms
    Réponses: 3
    Dernier message: 02/04/2007, 19h37
  2. [Debutant]Exception NoClassDefFoundError dans main
    Par Mystnux dans le forum Langage
    Réponses: 4
    Dernier message: 17/06/2006, 12h24
  3. [SGBD] FPDF+enregistrer le pdf généré dans BDD MySQL
    Par Flushovsky dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 29/11/2005, 16h22
  4. Catcher une exception lancée dans un plugin
    Par :Bronsky: dans le forum C++
    Réponses: 8
    Dernier message: 18/01/2005, 00h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo