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 :

Traitant de signaux et méthode


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 68
    Points : 52
    Points
    52
    Par défaut Traitant de signaux et méthode
    Bonjour,

    Je désire définir au sein d'une classe un traitant de signal qui modifie un attribue. En schématisant :

    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
    26
    27
    28
    29
    30
    31
    32
     
    A.h :
     
    class A{
    private : 
         bool att1;
    public :
         A();
         ~A();
    }
     
    A.c :
     
    void fct(int signum)
    {
         att = true;
    }
     
    A::A()
    {
        struct sigaction gest;
        gest.sa_handler = fct;
        gest.sa_flags = 0;
        sigaction(SIGUSR1, &gest, NULL);
     
        att = false;
     
    }
     
    A::~A()
    {
    }
    Seulement, ceci ne peut pas fonctionner car l'attribut "att" n'existe pas pour le traitant "fct" car ce n'est pas une méthode de la classe. Si je mets le traitant en tant que méthode de la classe, la structure de sigaction n'est plus valide :

    error: argument of type ‘void (A:(int)’ does not match ‘void (*)(int)’

    J'ai pensé à faire une méthode "setAtt()", mais comme celle-ci ne peut être utilisée que dans une instance de l'objet, je ne peux l'utiliser comme tel dans le traitant.

    Je voudrais donc savoir plusieurs choses :

    Déjà, est-ce que c'est propre de déclarer un traitant dans une classe ? (bien que je n'ai besoin d'instancier qu'un seul objet, si je voulais en instancier plusieurs, le même traitant serait redéclarer)

    Y a-t-il un moyen plus intelligent de le déclarer ? (je dois le déclarer dans le main ? A ce moment-là, comment puis-je "donner un argument" au traitant qui manipulerait alors un objet de type A ?)

    Je vous remercie d'avance pour vos réponses.

    Syl

  2. #2
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 533
    Points : 6 709
    Points
    6 709
    Par défaut
    Bonjour,

    Si les modifications à effectuer portent uniquement sur des attributs de classe (et non d'instance) alors vous pouvez remplacer fct par une opération de la classes (et non d'instance)

    Sinon votre problème principal sera de savoir sur qu'elle instance les traitements seront effectués. Pour se faire vous pouvez très bien utiliser une sorte d'abonnement, comme le fait Qt par exemple, mais comme dans votre cas le profile le profile de l'opération est fixe vous n'avez pas à passer par un outil de génération tel que moc. Le plus propre est alors de passer par une interface SignalSubscriber ne déclarant que l'opération handler, les classes ayant des instances pouvant s'abonner au signal devant hérité de SignalSubscriber. De l'autre coté vous avez une sorte de contrôleur (à oriori un singleton) dont une opération de classe est le handler fournis au sigaction, et qui via une autre opération reçoit les demandes d'abonnement avec un arg de type SignalSubscriber et à priori un autre indiquant le signal auquel on s'interesse
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 68
    Points : 52
    Points
    52
    Par défaut
    Merci pour votre réponse.

    Citation Envoyé par bruno_pages Voir le message
    Bonjour,
    Si les modifications à effectuer portent uniquement sur des attributs de classe (et non d'instance) alors vous pouvez remplacer fct par une opération de la classes (et non d'instance)
    C'est ce que je voulais faire en fait. Le souci, c'est quand je renseigne le champ sa_handler par une méthode de ma classe, j'ai un message d'erreur concernant le typage (voir le message d'erreur plus haut).

    Du coup, je suis passé par une variable globale qui est modifiée par le traitant de signal, puis une méthode modifie l'attribut de l'objet ... mais je ne trouve pas ça très propre.

    Syl

  4. #4
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 533
    Points : 6 709
    Points
    6 709
    Par défaut
    Citation Envoyé par syl1405 Voir le message
    c'est quand je renseigne le champ sa_handler par une méthode de ma classe, j'ai un message d'erreur concernant le typage
    vous n'aviez pas donné la version avec l'opération, mais à priori c'est parce que celle-ci n'était pas une opération de classe (c.a.d. static)

    il faut donc quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class A{
    ...
       static void handler(int);
    ...
    };
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 68
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par bruno_pages Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class A{
    ...
       static void handler(int);
    ...
    };
    Merci beaucoup pour cette information !

    Syl

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/05/2014, 15h51
  2. Traitant de signaux dans une classe
    Par syl1405 dans le forum C++
    Réponses: 10
    Dernier message: 12/08/2010, 09h08
  3. [Singleton] Différences avec méthodes statiques
    Par Franche dans le forum Design Patterns
    Réponses: 1
    Dernier message: 26/02/2003, 17h10
  4. Probleme d'impression avec la méthode TForm->Print()
    Par Kid Icarus dans le forum C++Builder
    Réponses: 13
    Dernier message: 31/07/2002, 14h26
  5. Cryptage en C selon la méthode de césat
    Par shenron dans le forum C
    Réponses: 2
    Dernier message: 31/05/2002, 08h22

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