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++Builder Discussion :

Quelques questions sur les threads


Sujet :

C++Builder

  1. #21
    Membre éclairé Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Par défaut
    Ne t'inquiète pas, tu ne me vexes pas !
    Je préfère qu'on me réponde, surtout si je dis des âneries !

    En fait je souhaite bien utiliser l'héritage pour une bonne raison, mais j'ai du mal m'exprimer.

    En fait, la classe TThread ne contient pas assez de propriétés à mon goût. Je souhaite lui ajouter la propriété "Config" et ensuite, je souhaite créér de nouvelles classes dérivées de celle-ci pour les utiliser dans une autre classe (TTimerPlanning).

    A priori, je suis parvenu à réaliser tout cela en ne mettant pas d'Execute à la classe dérivée de TThread, mais en mettant un virtual Execute à la classe dérivée de cette dernière.

    Explication par l'exemple :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    // -----------------------------------------------------------
    // Classe dérivée de TThread avec une propriété de +
    // -----------------------------------------------------------
    class TThreadSpeciale : public TThread
    {
     public:
            Config *VilleConfig;
     
            __fastcall TThreadSpeciale (bool CreateSuspended, Config *config) : TThread(CreateSuspended)
            {
                    VilleConfig = config;
            }
    };
     
    // -----------------------------------------------------------
    // Différentes classes dérivées de TThread1
    // -----------------------------------------------------------
    class TThread1 : public TThreadSpeciale 
    {
     protected:
            virtual void __fastcall Execute()
            {
                    Fonction1(...);
            }
     
     public:
            __fastcall TThread1(bool CreateSuspended, Config *config) : TThreadSpeciale(CreateSuspended, config) {}
    };
    // -----------------------------------------------------------
    class TThread2 : public TThreadSpeciale 
    {
     protected:
            virtual void __fastcall Execute()
            {
                    Fonction2(...);
            }
     
     public:
            __fastcall TThread2(bool CreateSuspended, Config *config) : TThreadSpeciale(CreateSuspended, config) {}
    };
    // -----------------------------------------------------------
    class TThread3 : public TThreadSpeciale 
    {
     protected:
            virtual void __fastcall Execute()
            {
                    Fonction3(...);
            }
     
     public:
            __fastcall TThread3(bool CreateSuspended, Config *config) : TThreadSpeciale(CreateSuspended, config) {}
    };
     
    // -----------------------------------------------------------
    // Classe TTimerPlanning 
    // -----------------------------------------------------------
    class TTimerPlanning : public TTimer
    {
      public:
            TLabel *Label;                           // Label qui affichera le temps restant
            String TexteLabel;                      // Texte qui sera affiché sur le label. Par exemple, TexteLabel = "Prochain téléchargement dans "
            TThreadSpeciale *Thread;          // Thread qui sera lancé "OnTimer"
     
            vector<unsigned short> PlanningHeure;   
            vector<unsigned short> PlanningMinute; 
     
            __fastcall TTimerPlanning(TComponent *AOwner, vector<unsigned short> planning_heure, vector<unsigned short> planning_minute, TThreadSpeciale *thread);
           __fastcall TTimerPlanning(TComponent *AOwner, vector<unsigned short> planning_heure, vector<unsigned short> planning_minute, TThreadSpeciale *thread, TLabel *label, String texte_label);
    };
    Ainsi je pourrai déclarer différentes instances de TTimerPlanning avec chacun des différents thread Thread1, Thread2, Thread3 etc... sans avoir à recréer à chaque fois un TTimerPlanning pour chacun des threads !

    Tout cela fonctionne (à priori !), mais je souhaiterai néanmoins savoir si c'est correct (notamment le virtual void Execute) et s'il n'y a pas de fuite de mémoire (mon cauchemar).

    Merci en tout cas de t'être penché sur mon problème.

  2. #22
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    C'est correct je pense.

    Tu as donc compris que tu n'auras qu'un seul Thread exécuté par chaque enfants de TThread avec ton code.

    Heureusement qu'il ny a pas trop de limite en nombre de thread sous Windows

  3. #23
    Membre éclairé Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Par défaut
    Je te remercie !

    Je laisse encore ce sujet un peu ouvert avant de mettre le [résolu], si des fois quelqu'un passait et trouvait une erreur de fuite de mémoire...

  4. #24
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    Si tu es sous Windows, il y a une astuce simple:
    Tu te fais une application de test qui créait un grand nombre de tes objets.

    Tu utilises le gestionnaire de tâche, tu note avant de lancer l'application combien il y a de RAM libre.

    Tu lances ton application, et uniquement elle! Toujours à partir du gestionnaire, tu note la RAM libre et utilisée.

    Tu ferme correctement ton application et tu notes la RAM libre, tu dois avoir moins de 1% de différence.

    Tu n'as pas de risque de fuite mémoire si tu n'utilises pas d'allocation dynamique (new ou malloc).

  5. #25
    Membre éclairé Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Par défaut
    Merci encore pour cette astuce.
    Je pense que je vais essayer de faire comme ça pour vérifier les fuites mémoires.

    (il me reste malgré tout un souci à cause des threads, il y a 2 fonctions qui ouvrent de gros fichier dans des TStringList, et qui sont lancées par 2 threads en même temps... et ça m'envoie une alerte "pas assez de mémoire". Je vais essayer de corriger ça à présent )

  6. #26
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    Est-il nécessaire d'avoir deux exemplaires des fichiers en mémoire?

    Car il est possible de partager de la mémoire entre Thread.

    L'API windows est bien pourvu pour ça:
    Partage entre processus=> CreateFileMapping et fonctions associées.

    Partage entre Thread => N'importe quelle variable globale peut être partagée entre Thread, MAIS PAS ENTRE PROCESSUS. Il faut cependant en sécuriser l'accès en Ecriture/Lecture par mutex, section critique et mon préféré Lecteur Rédacteur (le nom du composant est à rallonge, je ne m'en suviens plus).

    Partage entre thread mais local à chacun des thread: TLSData et fonctions associées.

    Regarde l'aide pour les détails.

  7. #27
    Membre éclairé Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Par défaut
    Malheureusement il est nécessaire d'avoir les 2 fichiers en mémoire. Et en +, j'utilise d'autres classes qui traitent les fichiers donc il serait trop complexe de gérer en mémoire les accès et leur partage (vu le temps qu'il m'est alloué pour faire cela).

    Les erreurs mémoire apparaissent lorsque j'utilise CodeGuard : même en faisant des try catch sur les points qui posent problème, la fonction s'arrête et ne va pas jusqu'au bout. En désactivant codeguard et en mettant l'application en version finale, je n'ai aucun message de manque de mémoire (ni même un access violation), et les 2 fonctions appelées par les 2 threads vont jusqu'au bout.

    Je te remercie néanmoins pour ces précisions !

  8. #28
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Par défaut
    Pour le fuites mémoire sous C++ Builder il suffit d'activer CodeGuard dans les options du projet....il les trouveras comme un grand si elles se produisent à l'exécution !

  9. #29
    Membre éclairé Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Par défaut
    ben justement non, pour les threads j'ai constaté des endroits où il ne trouvait pas de fuites mémoires alors qu'il y en avait...

    mais il est vrai que généralement j'utilise CodeGuard, c'est bien pratique !!

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Quelques question sur les threads
    Par Zoners dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 15/04/2010, 22h19
  2. Quelques questions sur les annuaires ldap
    Par rvfranck dans le forum Réseau
    Réponses: 7
    Dernier message: 15/08/2006, 02h41
  3. Quelques questions sur les LOB
    Par Wurlitzer dans le forum Oracle
    Réponses: 2
    Dernier message: 14/06/2006, 17h32
  4. Question sur les threads
    Par Linio dans le forum Concurrence et multi-thread
    Réponses: 10
    Dernier message: 21/10/2005, 09h08
  5. Question sur les threads
    Par nicolas66 dans le forum MFC
    Réponses: 4
    Dernier message: 03/06/2005, 20h57

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