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 :

Pilotage lecteur bancaire via RAII


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Par défaut Pilotage lecteur bancaire via RAII
    J'ai un lecteur de carte bancaire pour lequel on me fournit une DLL pour le piloter. J'aimerais en faire une classe RAII. Si un problème survient lors de la transaction, alors une exception est envoyée.

    Voici un exemple très simplifié du problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    class CDistributorRAII
    {
    public:
    	CDistributorRAII() {}
    	~CDistributorRAII() { CloseSession(); Disconnect(); }
     
    	void Connect() { if (!distributor_connect()) throw CConnectionException(); }
    	void OpenSession() { if (!distributor_open_session()) throw CSessionException(); }
    	void ProcessTransaction(float fAmount) { if (!distributor_process_transaction()) throw CTransactionException(); }
    	bool CloseSession() { if (!distributor_close_session()) throw CSessionException(); }
    	bool Disconnect() { if (!distributor_disconnect()) throw CConnectionException(); }
    };
     
    try
    {
    	CDistributor distributor;
     
    	distributor.Connect();
    	distributor.OpenSession();
    	distributor.ProcessTransaction(49.90);
    }
    catch (CDistributorException &e)
    {
    	cerr << e.what() << endl;
    }
    Le destructeur ferme une session ainsi qu'une connexion (bien sûr si elles sont ouvertes, par soucis de visibilité, je ne l'ai pas intégré dans le code exemple). Ces fonctions peuvent renvoyer une erreur dans la DLL, j'aimerais donc pouvoir lancer une exception. Cependant, un destructeur ne doit jamais envoyer d'exception. D'où le problème.

    Pour résoudre ce problème, je suppose que je dois faire des classes RAII pour une connection et une session?

  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 292
    Billets dans le blog
    2
    Par défaut
    Pourquoi ne pas faire une fonction membre publique qui appelle CloseSession() et Disconnect()?
    Autrement dit, sortir CloseSession() et Disconnect() du destructeur.

  3. #3
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    Si jamais la solution précédente ne te vas pas, tu as toujours le choix de gérer les erreurs à l'intérieur de ton destructeur, sans rien faire remonter...

  4. #4
    Membre éclairé Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Par défaut
    Citation Envoyé par r0d Voir le message
    Pourquoi ne pas faire une fonction membre publique qui appelle CloseSession() et Disconnect()?
    Autrement dit, sortir CloseSession() et Disconnect() du destructeur.
    Je ne veux pas appeler explicitement ces 2 fonctions, d'où l'idée de le mettre dans le destructeur. Ou s'ils sont appelés explicitement, alors bien sûr ne sera pas rappelé dans le destructeur.

    J'ai fait la solution de Lavock, après tout, même si la fermeture de session ou déconnexion échoue, la transaction a quand même réussi au final.

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 292
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par trunk
    J'ai fait la solution de Lavock, après tout, même si la fermeture de session ou déconnexion échoue, la transaction a quand même réussi au final.
    Je pense que c'est effectivement une bonne solution. Surtout que ce type de matériel est extrêment protégé. Je veux dire par là que tu n'as aucun risque de le laisser dans un état "dangereux". Tu utilise MDB pour la communication?

  6. #6
    Membre éclairé Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Par défaut
    Citation Envoyé par r0d Voir le message
    Je pense que c'est effectivement une bonne solution. Surtout que ce type de matériel est extrêment protégé. Je veux dire par là que tu n'as aucun risque de le laisser dans un état "dangereux". Tu utilise MDB pour la communication?
    Qu'est-ce qu'un MDB?

  7. #7
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 292
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Trunks Voir le message
    Qu'est-ce qu'un MDB?
    Donc non, tu n'utilises pas
    MDB est un protocole de communication conçu pour les machines dites de "vending", mais en fait il s'utilise aussi souvent pour les machines "à carte" (distributeurs, etc.).

Discussions similaires

  1. se connecter à un lecteur réseau via service windows
    Par Tiger44 dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 27/01/2010, 19h41
  2. Accèder à un lecteur réseau via Apache 2
    Par ndsaerith dans le forum Apache
    Réponses: 4
    Dernier message: 04/11/2008, 13h39
  3. Intégrer un lecteur vidéo via XML ?
    Par Maomam dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 24/04/2008, 12h14
  4. Pilotage d'Excel via la classe
    Par petit arbre dans le forum WinDev
    Réponses: 1
    Dernier message: 25/11/2006, 22h40
  5. Pilotage d'excel via Access
    Par Bombar dans le forum Access
    Réponses: 8
    Dernier message: 30/07/2006, 18h51

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