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 :

Monitoring de variables


Sujet :

C++

  1. #1
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut Monitoring de variables
    Bonjour,

    Je reviens avec un nouveau super sujet !

    Aujourd'hui, le but du jeu est de faire du monitoring de variables sur un système embarqué. Un genre de probe / oscilloscope de variables. Appelons cette classe Probe pour le moment. La partie PC pour faire de l'affichage est OK, ce qui me titille est la manière de récupérer les données. En fait, ce n'est pas le PC qui va envoyer les données, c'est le système embarqué qui va envoyé des données formatées sur une liaison série. L'idée est qu'il aura une liste de variables connues et les valeurs seront envoyées régulièrement.

    Mon questionnement est sur la manière de "surveiller" ces variables. Probe exposera des méthodes pour enregistrer des variables à surveiller. Un code tout simple ressemblerait à ça :
    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
    class Probe {
    public:
        void watch(const int& integer) {
            integer_m = &integer;
        }
     
        void monitor() const {
            if (integer_m) {
                std::cout << *integer_m << std::endl;
            }
        }
     
    private:
        const int* integer_m = nullptr;
    };
     
    int main() {
        Probe probe;
     
        int a = 42;
        probe.watch(a);
     
        probe.monitor();
     
        a = 666;
        probe.monitor();
    }
    Et il affiche bien 42 et 66.

    Là où ça se complique, c'est pour surveiller une classe, notamment les champs privés. Prenons cette classe à surveiller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Translator {
    public:
        enum Locale { // ...
        };
        Translator(Locale locale);
        std::string translate(std::string original);
    private:
        Locale locale_m;
    };
    Comment faire ? Je ne vois pas trop Probe avoir une méthode par type d'objets à supporter. Et je ne vois pas trop non plus Probe est ami avec tout le monde.

    Mon idée serait que la classe Probe reste simple. Elle ne sait faire des watch() que sur des types de bases. Ensuite, chaque classe qui aurait besoin d'être surveiller se verrait adjointe d'une classer helper. Par exemple, TranslatorWatcher. Cette classe serait ami de Translator et serait capable de récupérer les données privées intéressantes, les transformant si besoin pour caler aux capacités de Probe. Je multiplie un peu les classes mais je reste très modulaire.

    Qu'en pensez-vous ? Avez-vous de brillantes idées à me communiquer ?

    Merci d'avance !

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Pas possible de faire le DP Observer ?

  3. #3
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Bonjour,

    si une telle possibilité est convenable, un visiteur serait approprié :
    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
     
    class Probe;
    struct Watchable { virtual void watch(Probe& p) const = 0; };
     
    // ...
     
    class Coordinates : public Watchable
    {
        double x, y;
    public:
        void watch(Probe& p) const override { p.watch(x); p.watch(y); }
    };
     
    int main()
    {
        Coordinates c;
        // ...
        Probe p;
        c.watch(p);
        probe.monitor();
    }
    Chaque classe pouvant être monitorée doit connaitre l'interface Watchable, c'est le gros désavantage. Mais pas d'amis. Chaque classe est responsable d'exposer à une sonde ses propres variables.
    -- Yankel Scialom

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Merci pour vos réponses !

    Je n'avais pas du tout pensé à Observer/Observable. Je dois pouvoir surveiller des variables de types de base et potentiellement des registres du MCU directement donc il faudrait faire des wrappers autour. Ca inverse aussi le pattern car j'ai un observer et plusieurs observables.

    J'avais pensé à Visitor mais je ne le connais pas très bien et je n'ai pas creusé dans cette direction. Cela ressemble à ce que mes collègues proposaient de faire je pense.

    Dans tous les cas, on se retrouve à devoir faire une brèche dans le couplage entre entité. Je vais faire des essais pour voir comment respecter SOLID au maximum.

    J'ai testé un peu la solution que j'évoquais. J'arrive à des trucs comme ça :

    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
    template<typename T>
    class ProbeBinder {
    public:
        virtual void attach(Probe& probe, const T& t) = 0;
    };
     
     
    class Translator {
    public:
        // blabla
    private:
        Locale locale_m;
        friend class TranslatorProbeBinder;
    };
     
    class TranslatorProbeBinder : public ProbeBinder<Translator> {
    public:
        void attach(debug::Probe& probe, const Translator& t) override {
            probe.watch(t.locale_m);
        }
    };
     
    int main() {
        Translator translator;
        TranslatorProbeBinder helper;
        helper.attach(probe, translator);
    }
    L'interface ProbeBinder c'est à uniformiser les nommages des classes qui vont faire le lien, on pourrait s'en passer techniquement. Ce qui est pas mal dans cette solution, c'est les objets binders sont temporaires, on ne garde rien en mémoire une fois le binding fait. Ils servent "juste" à casser l'encapsulation des champs privés. Fondamentalement, c'est comme la proposition avec Watchable, sauf que ça sépare en 2 classes (je me dis que ça respecte un peu plus le S de SOLID...) et que ça gagne un peu de mémoire (comme je suis en embarqué c'est toujours ça de pris).

  5. #5
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    À partir du moment où vous laissez un mécanisme externe interférer avec la représentation de vos classes, vous pouvez ranger SOLID au placard. Au mieux, vous pouvez respecter SOLID si votre Probe est ignorée, ce qui est déjà pas mal.

    Mais on ne fait pas de watchdog sans casser de pattern.
    -- Yankel Scialom

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Bktero Voir le message
    (je me dis que ça respecte <snip> que ça gagne un peu de mémoire (comme je suis en embarqué c'est toujours ça de pris).
    Tu te dis que tu gagne un peu de mémoire, ou tu as des mesures concrètes pour confirmer tes dires

    Et, sinon, faisons "simple": un système de "callback" (idéalement, j'irais même jusqu'à une système de signaux et de slots, mais, en embarqué ... /p) d'une fonction par valeur à surveiller, ce ne serait pas possible

    Je sais pas, moi, un genre de callback onXYGChanged(newValue), dans lequel tu indiquerait, pour chaque variable à surveiller, ce qui doit être fait
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/09/2014, 23h56
  2. variables locales ou globales ???
    Par elvivo dans le forum C
    Réponses: 13
    Dernier message: 03/07/2002, 08h22
  3. Procédure avec un nombre variable d'arguments
    Par charly dans le forum Langage
    Réponses: 15
    Dernier message: 21/06/2002, 11h08
  4. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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