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 :

Comment arrêter automatiquement des threads à la fin du programme principal?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut Comment arrêter automatiquement des threads à la fin du programme principal?
    Salut

    J'ai une "pool de threads" que je voudrais arrêter à la fin de l'exécution du programme principal. Plutôt que de le faire explicitement par un appel à une fonction, je voudrais le faire automatiquement.

    J'ai pensé mettre cet appel dans le destructeur d'une classe statique, malheureusement ça ne marche pas: le destructeur de la classe n'est pas appelé une fois le main fini, sans doute parce qu'il reste des threads actifs (en attente).

    Je ne sais pas si c'est faisable d'une manière ou d'une autre.
    Des idées?

  2. #2
    Membre éprouvé
    Inscrit en
    Mai 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Par défaut
    Je ne m'y connait pas trop en threads et c++, mais peut etre que tu peux passer par un exe externe pour faire un arret violent par l'intermediaire d'un batch que tu lances depuis ton main a la fin....

    A ce moment la tu utilise la navigation par les menus dans ton batch pour aller arreter l'arborescence des processus de l'executable donne.
    (J'utilisais cette manipe pour aller taper sur les cartes réseaux non accessible par le framework sous 2000pro)
    Si tu veux l'exemple pour les cartes reseaux fais le mois savoir j'irais chercher le code....

    ++

  3. #3
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Citation Envoyé par Charlemagne
    J'ai pensé mettre cet appel dans le destructeur d'une classe statique, malheureusement ça ne marche pas: le destructeur de la classe n'est pas appelé une fois le main fini, sans doute parce qu'il reste des threads actifs (en attente).
    Tu es sûr ? Je reste dubitatif, la fonction main est une fonction comme les autres et les destructeurs seront appelés. main n'est même pas en réalité la première fonction à être exécuté et n'est donc pas la dernière (il y a pas exemple _start sous Unix)

    J'ai déjà écrit un code d'une classe du genre : ThreadGroup qui permet de rejoindre tous les threads dans le destructeur, et ça marche sans problème

  4. #4
    Membre éprouvé
    Inscrit en
    Mai 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Par défaut
    Citation Envoyé par millie
    Tu es sûr ? Je reste dubitatif, la fonction main est une fonction comme les autres et les destructeurs seront appelés. main n'est même pas en réalité la première fonction à être exécuté et n'est donc pas la dernière (il y a pas exemple _start sous Unix)
    Je suis entierement d'accord pour le main. Apres etre sur, je te repondrais que j'ai effectue quelquechose de ce genre pour la gestion de cartes reseaux, en navigant par l'intermediaire d'un script dans les menus, et ainsi faire comme avec la souris.... Mais je n'ai pas dit que c'etait la meilleure solution... La tienne :
    Citation Envoyé par millie
    J'ai déjà écrit un code d'une classe du genre : ThreadGroup qui permet de rejoindre tous les threads dans le destructeur, et ça marche sans problème
    est plus elegante et sera surement de meilleur qualité.

    rikau2

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    @ Rikau2: J'exclue ta proposition d'un exécutable externe, je veux une solution 100% C++.

    Citation Envoyé par millie
    Tu es sûr ? Je reste dubitatif, la fonction main est une fonction comme les autres et les destructeurs seront appelés. main n'est même pas en réalité la première fonction à être exécuté et n'est donc pas la dernière (il y a pas exemple _start sous Unix)
    J'étais sûr, mais maintenant je le suis moins. (j'ai compilé avec Intel C++ Compiler sous Windows)
    Je vais encore vérifier...

    Citation Envoyé par millie
    J'ai déjà écrit un code d'une classe du genre : ThreadGroup qui permet de rejoindre tous les threads dans le destructeur, et ça marche sans problème
    Et le destructeur est appelé si tu fais une instance statique?

  6. #6
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Oui oui, bien sûr. Sur un code comme ça par 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
     
    class MonThread : public GThread {
     
      private:
       int n;
     
      public:
       MonThread(int a)
       {
         n=a;
       }
       void run()
       {
         for(int j=0; j<5; j++) {
         for(int i = 0; i<1000;i++) {
           // sleep(1);
           std::cerr<<"Thread numero : "<<n<<std::endl;
         }
     
           waitAllGroup();
         }
       }
     
    };
     
    static ThreadGroup group;
     
    int main (void)
    {
     
      group.add(new MonThread(0));
      group.add(new MonThread(1));
      group.startAll();
     
      return EXIT_SUCCESS;
    }
    Le destructeur affiche bien un message au moment ou tous les threads ont été rejoints

    EDIT : A noter que le destructeur est appelé avant la fin des threads. Mais je les attend, donc il finit après la mort de tous les threads.

  7. #7
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    C'est bien le principe que je comptais utiliser.

    Ma vérification risque de durer un peu (j'ai fais des modifs non terminées dans ma gestion de threads)

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Je comprends pas trop.
    Qu'une classe statique n'appelle pas son destructeur je peux l'imaginer (j'ai déja eu bien des blagues avec les instances statiques), mais la question est pourquoi mettre ça en statique? Ton pool de threads est sensé être une classe maintenant une liste de réfèrence vers des threads, tu met bètemment dans son destructeur une boucle pour les interrompre et une autre pour faire un join dessus, et tu instancies ce pool au début de ton main.

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

Discussions similaires

  1. [WD11] comment inserer automatiquement des colonnes dans une table
    Par incomparable dans le forum WinDev
    Réponses: 3
    Dernier message: 31/08/2009, 13h51
  2. [IP-2003] Comment traiter automatiquement des formulaires Infopath ?
    Par Romeoo dans le forum InfoPath
    Réponses: 2
    Dernier message: 20/05/2009, 07h10
  3. Comment créer automatiquement des raccourcis ?
    Par Moine dans le forum Débuter
    Réponses: 5
    Dernier message: 22/10/2007, 18h11
  4. Comment on fait des threads?
    Par chrono23 dans le forum C++
    Réponses: 35
    Dernier message: 23/09/2006, 00h47
  5. Comment demarrer automatiquement des daemons
    Par mariogarcia dans le forum Administration système
    Réponses: 14
    Dernier message: 12/06/2006, 20h34

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