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

Boost C++ Discussion :

Arreter l'execution d'un boost::thread


Sujet :

Boost C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Points : 77
    Points
    77
    Par défaut Arreter l'execution d'un boost::thread
    Bonsoir tout le monde,
    Voila je me prend la téte avec ca depuis ce matin!
    Je ne trouve pas comment on peut arreter un thread crée avec la biblio. Boost.Thread, La documentation dans boost.org étant un peu pauvre ...
    J'ai vu qu'on pouvait l'endormir avec la méthode sleep() , une autre méthode yield() sert
    à le mettre dans un état Ready , par contre pas de méthodes pour l'arreter.
    J'ai repris un exemple du site officiel de Boost et je l'ai modifier pour qu'il boucle à l'infini, si quelqu'un peut me dire quoi ajouter pour arreter l'execution je lui serai tres reconnaissant.
    Voici mon code :
    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
    #include <boost/thread/thread.hpp>
    #include <boost/thread/xtime.hpp>
    #include <iostream>
    using namespace std;
    struct thread_alarm
    {
       thread_alarm(int secs) : m_secs(secs) { }
       void operator()()
       {
           int cpt =0;
    
           boost::xtime xt;
           boost::xtime_get(&xt, boost::TIME_UTC);
           xt.sec += m_secs;
    
           boost::thread::sleep(xt);
    
           std::cout << "alarm sounded..." << std::endl;
    
           while(1){
           	if(cpt > 1000){
           	 /* Comment Arreter le thread et sortir ? */
           	}
           }
       }
    
       int m_secs;
    };
    
    
    
    int main(int argc, char* argv[])
    {
      int secs = 5;
       std::cout << "setting alarm for 5 seconds..." << std::endl;
       thread_alarm alarm(secs);
       boost::thread thrd(alarm);
       thrd.join();
    
    }
    Merci

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Le plus simple serait encore d'utiliser une variable booléenne comme condition de ta boucle, et de la changer dans le thread principal lorsque tu veux stopper ton thread.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par Laurent Gomila
    Le plus simple serait encore d'utiliser une variable booléenne comme condition de ta boucle, et de la changer dans le thread principal lorsque tu veux stopper ton thread.
    J'ai pas bien compris ce que tu voulais dire par "..la changer dans le thread principal lorsque tu veux stopper ton thread".

    Sinon en réalité, j'ai une méthode (un traitement ) que j'appel plusieurs fois avec differents paramétres et ils se peut que cette méthode boucle à l'infini du coup si ca boucle je ne pourrai pas effectuer tout les traitements souhaités.
    Donc ce que je voulais faire c'est fixer un temps d'execution (5 minute par exemple pour chaque traitement) si au bout de ce temps le traitement boucle je l'arrete et je passe au suivant ainsi de suite .
    Tu pense qu'avec ta suggestion ca serait possible de faire tout ce que je viens de citer?

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    C'est dans la FAQ de boost.thread, question 9.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par loufoque
    C'est dans la FAQ de boost.thread, question 9.
    Je trouve pas la question 9 dont tu m'a parlé, peut tu me donner le lien pour aller
    sur la page stp?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Points : 77
    Points
    77
    Par défaut
    Aprés une recherche dans le cache de google j'ai trouver ceci dans la FAQ de boost:

    9. Why isn't thread cancellation or termination provided?
    There's a valid need for thread termination, so at some point Boost.Threads probably will include it, but only after we can find a truly safe (and portable) mechanism for this concept.

    J'en déduit donc qu'il est impossible d'arreter un boost::thread pour le moment !
    Sinon quelqu'un pourrai me proposer une astuce , ou une autre libraire portable à utiliser pour
    coder en C++ ce que je souhaite faire?

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Laurent ne t'a pas déjà donné un moyen, qui d'ailleurs semble être bien plus adapté que de tuer le thread de manière abrupte ?

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par loufoque
    Laurent ne t'a pas déjà donné un moyen, qui d'ailleurs semble être bien plus adapté que de tuer le thread de manière abrupte ?
    Si pour l'exemple de code que j'avai poster cela semble marcher en rajoutant un booléen , que le 2éme thread modifiera dans le main afin de sortir de la boucle...
    Mais il s'avere que pour ce que je veux faire ca ne marchera pas car la fonction qui risque de boucler je ne peux pas la modifier , je n'ai pas accés à son code source,
    donc il est impossible je pense de l'arreter avec l'astuce du booléen.
    Tu vois un peu le probléme?

  9. #9
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Si tu ne peux pas modifier la fonction il te faut un moyen d'annuler le thread effectivemment. Mais cela est dangereux, ce serait peut-être mieux de faire ça avec des processus.

    Quoi qu'il en soit, tu peux faire ce genre de choses avec les pthreads.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par loufoque
    Si tu ne peux pas modifier la fonction il te faut un moyen d'annuler le thread effectué. Mais cela est dangereux, ce serait peut-être mieux de faire ça avec des processus.

    Quoi qu'il en soit, tu peux faire ce genre de choses avec les pthreads.
    Je pense aussi que c'est dangereux d'arreter un thread comme ca brutalement, mais bon j'ai pas trop d'idées quoi pour résoudre mon probléme c'est pourquoi j'ai pensé qu'en le tuant je pourrai arreter les traitements qui bouclent et poursuivre les autres traitement que je désire effectuer.
    Je pense que c'est possible de faire ca avec les pthread, mais il me faut une libraire portable car mon application devrait fonctionner sous les differents OS (ou au moins sous windows et linux) . Et je pense que les pthreads sont utilisable que sous linux.
    Je vais continuer à faire mes recherches sur le net et si quelqu'un à une proposition , elle serait la bienvenue.

Discussions similaires

  1. Boost::Thread, probleme d'execution en parallele
    Par Jdumont dans le forum Boost
    Réponses: 4
    Dernier message: 05/03/2012, 14h47
  2. arreter l'execution d'un thread en java
    Par albokos dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 21/05/2008, 03h13
  3. arreter l'execution du javascript
    Par elendrim dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/03/2006, 11h17
  4. Arreter l'execution d'une requete ?
    Par Olv_m dans le forum ASP
    Réponses: 2
    Dernier message: 13/10/2005, 22h57
  5. [netbeans] Arreter une éxécution
    Par Kaor dans le forum NetBeans
    Réponses: 1
    Dernier message: 11/02/2005, 15h27

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