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

Langage C++ Discussion :

Try Catch (?) sur une erreur d'accès mémoire


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 12
    Points : 12
    Points
    12
    Par défaut Try Catch (?) sur une erreur d'accès mémoire
    Bonjour à tous,

    La question est hyper simple, et pourtant je n'ai pas réussi.
    Je cherche à utiliser un Try{} Catch() {} qui prendra en charge un cas où le buffer auquel j'essaye d’accéder deviendrait indisponible, afin d'éviter le crash d'application qui en découle.

    Oui je sais, pour ce genre de problème, le but n'est pas de faire n'importe quoi pour laisser Try Catch rattraper le coup, je vous expose donc rapidement mon problème (évidemment que le meilleur moyen de se protéger contre un accès mémoire dans les choux, c'est de se débrouiller pour ne pas faire n'importe quoi, et à ce moment là, ça marche très bien).

    J'utilise un ActiveX, dans mon projet MFC C++, qui m’appelle une fonction de callback sur évènement, dès qu'un image est prête. Cette fonction de callback accède au buffer de l'ActiveX pour en lire le contenu et l'adapter à mes variables de stockage/affichage d'image.

    Le souci, c'est que dans l'application multithread en question, le programme peut demander des choses à la camera (changement de temps d'exposition, reparamétrage de binning etc) en plein pendant la lecture du buffer de l'image par ma fonction de callback (et là, c'est le drame : le buffer est spontanément désalloué, redimensionné... et le callback, en plein dans la lecture du buffer de l'image à ce très mauvais moment, provoque le crash de l'application.)

    J'ai d'abord fait en sorte de proteger chaque accès à l'ActiveX par un sémaphore : ainsi, deux fonctions vivant sur des threads différents ne peuvent plus demander en même temps la caméra. Le Callback réserve lui aussi le sémaphore avant de pouvoir toucher au buffer, de façon à ce qu'aucune fonction concernant l'ActiveX ne puisse être appelée pendant la lecture du buffer. Ceci m'a permis de rendre l'application infiniment plus stable.

    Mais il existe quelques rares cas où l'application plante au moment d’accéder au buffer, juste au moment où l'on remet la caméra en route : l'event "image prête" arrive, déclenche le callback qui réserve son accès à la camera; il commence à accéder au buffer et Boum, plantage... Comme si l'ActiveX commence à me donner la main trop tôt en appelant mon Callback, et qu'il prépare le buffer après m'avoir donné la main.

    Du coup, je voudrais savoir si pour ce cas de la dernière chance, un Try Catch ([???]) serait disponible, car ceux que j'ai essayé jusqu'à présent n'ont pas su empêcher le crash d'application.

    Merci d'avance !

    PS : Évidemment, nous ne sommes pas à l'abri d'une réécriture du buffer par l'ActiveX (nouvelle image qui écrase la précédente) pendant notre lecture du buffer; mais il faut savoir que celui ci ne change pas d'adresse : au pire l'image est scindée en deux, ceci nous arrive et ne pose aucun souci car il ne s'agit que d'un visuel (pour les sauvegardes d'image en revanche on fait bien gaffe de mettre en pause l'acquisition avant de sauvegarder le contenu du buffer). C'est souvent au moment précis du redémarrage de l'acquisition continue que les problèmes ont lieu

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Si tu compiles avec les bons switches, un try {} catch(...) {} catchera les exceptions Win32.
    Regarde aussi du côté de _set_se_translator() qui peut traduire une exception Win32 (autre que "Microsoft C++ Exception") en exception C++.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Une erreur d'espace mémoire
    Par ToTo13 dans le forum Langage
    Réponses: 12
    Dernier message: 14/12/2006, 10h40
  2. [MySQL] Petite question sur une erreur de mysql
    Par iwf-fr dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 13/12/2006, 16h23
  3. Faire rendre MySQL plus explicite sur une erreur
    Par Xunil dans le forum Requêtes
    Réponses: 2
    Dernier message: 22/11/2006, 16h33
  4. [C#/MySQL] Pourquoi ai-je une erreur d'accès à ma BDD ?
    Par flykev dans le forum Accès aux données
    Réponses: 2
    Dernier message: 22/07/2006, 17h33
  5. Réponses: 13
    Dernier message: 23/02/2006, 11h42

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