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 :

Partage de mémoire entre classes


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 127
    Points : 54
    Points
    54
    Par défaut Partage de mémoire entre classes
    Bonjour,

    une petite question en C++ pour laquelle je ne trouve pas de réponse sur Internet, pourriez-vous m'aider ?

    1. J'ai un main dans lequel j'alloue plusieurs mémoires qui seront partagées par tout mon programme (ici un exemple avec listLoc).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
     
        // Create memory
        listLocalization * listLoc = new listLocalization();
     
        // Build central widget
        MainWindow::buildCentralWidget(listLoc);
    }
    2. J'ai une fonction qui crée des onglets (Qt). Ces onglets sont des classes et auront besoin d'accéder à listLoc (un exemple ici).

    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
     
    void MainWindow::buildCentralWidget(listLocalization * listLoc) {
     
        // Add central widget
        mainWidget = new QTabWidget();
     
        // Create first tab
        tab1 = new tabLocalization(mainWidget);
     
        // Add tabs
        mainWidget->addTab(tab1, tr("&Localization (database)"));
     
        // Define central layout
        setCentralWidget(mainWidget);
    }
    Comment est-ce que je peux donner accès à ma mémoire listLoc à la classe tabLocalization ?


    Une solution à laquelle je pense serait de rajouter un pointer dans la classe tabLocalization:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class tabLocalization : public QWidget {
        Q_OBJECT
     
    public:
        explicit tabLocalization(QWidget *parent = 0, listLocalization * listLoc);
        ~tabLocalization();
     
    private:
        listLocalization * listPtr;
    }
    Et de faire pointer listPtr vers listLoc dans le constructeur.

    Est-ce qu'il existe une façon plus simple ou propre de faire ce que je souhaite ?

    Merci pour votre réponse !

  2. #2
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Bonjour,

    L'utilisation d'un pointeur est une bonne idée, cependant, tu dois faire attention au pointeur. Je te conseil d'utiliser std::shared_ptr. C'est un wrapper pour ton pointeur qui vas s'assurer que tu ne le delete pas dans une classe alors qu'une autre l'utilise par exemple.
    Homer J. Simpson


  3. #3
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 127
    Points : 54
    Points
    54
    Par défaut
    Merci pour ta réponse et ok pour le shared_ptr.

    Pour ma compréhension uniquement, chaque classe aurait son pointeur "local" donc comment une classe pourrait supprimer le pointeur pour une autre classe ?

  4. #4
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Le problème n’est pas de supprimer le pointeur, mais de désallouer la zone mémoire pointée.

    Si tu l’alloues avant, et que tu t’assures de la désallouer une fois que tous les onglets sont fermés, pas de soucis. Si toutefois tu l’alloues au premier onglet ouvert, et que tu veux t’assurer qu’elle soit désallouée quand le dernier onglet est fermé, on est dans le cas d’une propriété partagée, et donc un shared_ptr est approprié.

    Attention aussi : si tu es en multithread, il est probable qu’il te faille un mutex pour protéger les accès à la mémoire (si tous les accès sont faits dans le même thread, pas besoin).

  5. #5
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 127
    Points : 54
    Points
    54
    Par défaut
    Merci pour vos réponses très claires, j'ai compris !

    Résolu.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut,

    Hummm... J'ai l'impression que tu es bien mal parti, là...

    tu travailles sur une interface graphique ici et tu dois donc adapter ton "système de pensée" à cette circonstance particulière.

    Le "système de pensée" auquel toute la partie dédiée à l'IHM de Qt tend à te faire adhérer est basé sur le principe du MVC (Modèle View Controler, même si certains esprits chagrins me rétorqueront peut etre que l'on est plus orienté vers un aspect proche du Model View Delegate ).

    C'est, très clairement, celui auquel tu devrais adhérer le plus vite possible.

    En effet, quel que soit le contenu réel de ta classe tabLocalization, c'est, d'abord et avant tout, un widget, c'est à dire un élément visuel.

    Autrement dit, c'est un élément qui intervient dans le domaine de la vue que l'utilisateur a des différentes données.

    Il ne va pas manipuler directement les données métier, non, non, non : il va les manipuler au travers d'un modèle! (typiquement, une classe dérivée de QAbstractModel )... Ou, du moins, il devrait le faire de la sorte

    Ton rôle consiste donc:
    1. A créer un modèle qui explique à la vue les différentes parties de tes donnée métier qui l'intéresse
    2. A remplir ce modèle avec des données pertinentes
    3. Si la vue doit permettre la modification des données qu'elle affiche, à créer un controleur qui s'assurera que les modifications sont sensées (on ne sait jamais, si c'est un singe qui est devant le clavier ) avant de modifier effectivement les données.
    En travaillant de la sorte:
    1. Le modèle peut parfaitement resservir pour une autre vue si besoin
    2. Le contrôleur peut parfaitement resservir dans des circonstances similaires
    3. Tu gardes tes données métier "bien au chaud" dans leur coin, et tu n'a pas à t'inquiéter de leur dispertion
    4. Le jour où tu décides de changer de bibliothèque d'IHM (les gens ont de ces lubies quand meme ), ta "base métier" reste réutilisable (à moins bien sur qu'elle ne fasse déjà une utilisation massive de possibilités propres à Qt )
    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

  7. #7
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 127
    Points : 54
    Points
    54
    Par défaut
    Pour être sûr de comprendre, je te propose ma vision initiale puis la même modifiée avec ce que j'ai compris :

    1. Approche initiale
    * listLocalization = "mémoire centrale" qui est en fait un vector d'objets Localization
    * dans l'onglet tabLocalization, l'utilisateur a 2 vues (j'ai un switch qui n'en fait apparaître qu'une à la fois) :
    - une vue détaillée (élément Localization par élément). Je modifie donc directement listLocalization en fonction des opérations de l'utilisateur
    - une vue en liste (voir tous les éléments). Je remplis un modèle (QStandardItemModel) avec listLocalization et quand je le souhaite, après modification par l'utilisateur, je modifie listLocalization avec le contenu du modèle
    => avec cette approche, il faut qu'à chaque fois que je change de vue, je rafraichisse la "mèmoire centrale" et ré-initialise le modèle
    * une fois que ceci est fait (en réalité sur plusieurs "mémoires centrales" indépendantes), je lance un calcul qui prend comme entrée les objets lus dans les "mémoires centrales", un à un, pour faire un calcul. J'essaye d'avoir les objets les plus légers possibles car c'est un calcul intensif (plusieurs heures à plusieurs dizaines d'heures)
    * J'ai des onglets de résultat. Je crée un modèle qui est rempli par le résultat du calcul précédent

    2. Ce que tu me conseilles serait :
    * créer un modèle de type QAbstractModel qui contient toutes mes données
    * dans l'onglet tabLocalization, générer 2 vues différentes depuis/vers ce même modèle
    * lancer le calcul sur ces modèles
    * afficher les résultats comme précédemment

    Est-ce que j'ai bien compris ?

    Est-ce que le fait de faire des calculs intensifs sur des modèles QT ne va pas être plus long que de le faire avec des vectors d'objets C++ ?

  8. #8
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Personnellement, j’utilise toujours QAbstractModel (du moins, son implémentation) comme glue entre mon modèle réel (pouvant être totalement indépendant de qt) et la vue, qui elle est fortement dépendante du toolkit qt.

    Travailler directement avec une classe QAbstractModel est de mon point de vue une très mauvaise idée. Cette classe est beaucoup trop liée à la notion d’interface graphique et d’affichage / édition des données.

  9. #9
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Le jour où tu décides de changer de bibliothèque d'IHM (les gens ont de ces lubies quand meme ), ta "base métier" reste réutilisable (à moins bien sur qu'elle ne fasse déjà une utilisation massive de possibilités propres à Qt )
    C'est là un gros problème de Qt, on à souvent des QVector, QString etc.. qui se retrouvent un peu partout pour ne pas avoir à faire de conversion à chaque fois. Les méthodes ont en plus des noms souvent légèrement différent de celles des conteneurs de la STL (pas pratique pour les templates).
    Changer de lib de GUI implique souvent de gros changements :/

    Qu'est ce que j'aimerai que Qt abandonne sa "QTL" pour utiliser la STL (ou propose un moyen d'utiliser la STL, pour ne pas avoir de problèmes de rétrocompatibilité).

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Citation Envoyé par julieng31 Voir le message
    Pour être sûr de comprendre, je te propose ma vision initiale puis la même modifiée avec ce que j'ai compris :

    2. Ce que tu me conseilles serait :
    * créer un modèle de type QAbstractModel qui contient toutes mes données
    * dans l'onglet tabLocalization, générer 2 vues différentes depuis/vers ce même modèle
    * lancer le calcul sur ces modèles
    * afficher les résultats comme précédemment

    Est-ce que j'ai bien compris ?
    Presque, mais pas tout à fait.

    D'abord, tu remarqueras que j'ai parlé de classe dérivée de QAbstractModel.

    Il existe déjà quelques classes dérivées de QAbstractModel dans Qt qui sont adaptée à certains besoins spécifiques.

    Tu trouveras peut être celle qui t'intéresses parmi elles

    Ensuite, L'idée est que cette classe est "simplement là" pour répondre aux différentes questions que ta vue peut éventuellement se poser.

    Le modèle ne sert pas à "générer" la vue. Il ne sert "qu'à fournir les informations qui rempliront la vue".

    A charge pour la vue d'aller "piocher" les informations dont elle a besoin dans le modèle

    Si deux vues différentes peuvent utiliser le même modèle, tant mieux: le modèle peut être partagé entre deux vues (ou plus).

    Par contre, rien ne t'empêche d'avoir un modèle par vue parce que les données affichées par l'une n'ont strictement rien à voir avec les données affichées par l'autre.

    Il t'appartient donc de déterminer quelles données seront accessibles depuis quel modèle et sera utilisé par quelle(s) vue(s) pour afficher les informations
    Est-ce que le fait de faire des calculs intensifs sur des modèles QT ne va pas être plus long que de le faire avec des vectors d'objets C++ ?
    Crois moi, si problème il y a, ce ne sera pas à cause des modèles en eux même, mais bien à cause des manipulations que tu dois faire sur tes données métier pour arriver à les remplir
    Citation Envoyé par white_tentacle Voir le message
    Personnellement, j’utilise toujours QAbstractModel (du moins, son implémentation) comme glue entre mon modèle réel (pouvant être totalement indépendant de qt) et la vue, qui elle est fortement dépendante du toolkit qt.
    C'est exactement ce que je propose
    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

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    C'est là un gros problème de Qt, on à souvent des QVector, QString etc.. qui se retrouvent un peu partout pour ne pas avoir à faire de conversion à chaque fois. Les méthodes ont en plus des noms souvent légèrement différent de celles des conteneurs de la STL (pas pratique pour les templates).
    Changer de lib de GUI implique souvent de gros changements :/

    Qu'est ce que j'aimerai que Qt abandonne sa "QTL" pour utiliser la STL (ou propose un moyen d'utiliser la STL, pour ne pas avoir de problèmes de rétrocompatibilité).
    C'est un problème récurrent à tout framework un tantinet correct, surtout s'il permet de faire de l'IHM.

    Les raisons sont souvent historiques, mais actuellement, je crois que c'est surtout au développeur de faire la distinction claire entre ses données métier (qui devraient être indépendantes du framework en question) et la manière dont elles sont utilisées.

    Cela demande très certainement énormément de concentration et, surtout, cela implique d'être d'accord pour se "compliquer un peu la vie" par moment

    ... Chose que très peu de dev sont d'accord de faire
    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

  12. #12
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 127
    Points : 54
    Points
    54
    Par défaut
    Et ben, j'ai bien fait de créer ce post

    Merci pour vos réponses, j'ai repris l'architecture pour me rapprocher de vos conseils !!

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    La plus idiote des questions est celle que l'on n'aura pas (osé) poser
    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. Partage de mémoire entre VS 6 et VS 2008
    Par mambo dans le forum VC++ .NET
    Réponses: 8
    Dernier message: 28/10/2008, 15h52
  2. Partage de mémoire entre processus
    Par Didj7 dans le forum Threads & Processus
    Réponses: 3
    Dernier message: 25/05/2008, 23h33
  3. partage de mémoire entre excel et les autres
    Par potili2 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 26/09/2007, 15h08
  4. partager un objet entre classes
    Par kirua2150 dans le forum Access
    Réponses: 5
    Dernier message: 26/01/2007, 11h33
  5. Partage de mémoire entre 2 exe
    Par ejaecker dans le forum Delphi
    Réponses: 12
    Dernier message: 09/09/2006, 15h03

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