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 :

probleme a l'arret de threads


Sujet :

C++Builder

  1. #1
    Sei
    Sei est déconnecté
    Candidat au Club
    Inscrit en
    Septembre 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 4
    Points : 3
    Points
    3
    Par défaut [resolu]probleme a l'arret de threads
    bonjour,
    j'ai un petit probleme avec les threads. J'ai cree une application qui fait de l'acquisition de sequence video (a partir d'une carte d'acquisition). J'ai implementer quelques fonctions me permettant d'acquerir et de visualiser en meme temps la sequence et cela grace a un thread. J'ai egalement deux autres threads qui permettent de faire une lecture arriere et avant lorsqu'on arrete l'acquisition.
    Mais le probleme est lorsque je termine l'un des threads, borland me dit:
    erreur systeme. erreur code: 6. Handle non valide
    Pourtant, j'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    monthread->FreeOnTerminate = false;
    monthread->Terminate();
    monthread->WaitFor();
    delete monthread;
    monthread = NULL;
    Est-ce quelqu'un pourrait me dire où se trouve mon erreur car des fois tout marche tres bien et d'autre fois tout plante.

    merci.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 61
    Points : 63
    Points
    63
    Par défaut
    bonjour Sei

    1°) FreeOnTerminate doit ètre placé a l'initialisation du Thread
    2°) Il est très important de prévoir un test de Terminated dans tes sous-routines de ton thread de façon à lorsque tu Met fin au thread, celui ci soit en mesure de ne pas executer une tâche de sous-routine
    exmple :
    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
     
    void TMonThread::Execute()
    {
         while(!Terminated && !Suspended
         {
              .....
              Synchronize(FaireQuelqueChose);
         }
    }
     
    void __fastcall TMonThread:: FaireQuelqueChose()
    {
    // execute une tàche supposée longue    
        for(short i=0; i<150; i++)
        {
           If(!Terminated) break;
           .....
           .....
         }
    }
    2°) Une autre manière de procèder plus élégante:
    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
     
    void TForm1::TForm1(TComponent *AOwner)
    {
        MonThread = new TMonThread(false);
        MonThread->Priority = tpLowest;
        MonThread->OnTerminate = MonThreadTerminate;
        MonThread->FreeOnTerminate = true;
    }
     
    // demande de fin de tache du Thread
    void TForm1:: EndMonThread(void)
    {
        MonThread->Terminate();
    }
     
    void __fastcall TForm1::MonThreadTerminate(TObject *)
    {
        Monthread = NULL; 
    }
    Voila en espèrant t'avoir aidé

    Laurent

  3. #3
    Sei
    Sei est déconnecté
    Candidat au Club
    Inscrit en
    Septembre 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    bonjour Laurent,
    merci pour ton aide.
    mais je comprends pas trop pourquoi mon code plante. De plus lorsque je laisse freeonterminate a true (a l'initialisation sans faire de delete dans le prog principal) mon thread plante a chaque fois. C'est peut etre lie au fait je cree un thread a chaque fois que je lance l'acquisition. Mais bon je vais mettre en application ton code et voir ca ce week-end.

    encore merci pour ton aide.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 61
    Points : 63
    Points
    63
    Par défaut


    Tu as écrit :
    monthread->FreeOnTerminate = false;
    monthread->Terminate();
    monthread->WaitFor();
    delete monthread;
    monthread = NULL;
    Attention !! dans ce cas, ne met pas la propriété FreeOnTerminate à true
    car il va ce produire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    monthread->FreeOnTerminate = true;
    monthread->Terminate();// A cet endroit !! ton monthread va planté
    // car dans la ligne ci après, tu fais reference à celui ci alors qu'il est détruit 
    monthread->WaitFor(); 
    delete monthread; 
    monthread = NULL;
    Ainsi, il est normal que ton Thread plante

    A + Laurent

  5. #5
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut
    j'ai eu le même problème que toi
    j'ai changé de PC pour passer sur un P4 2,4M et maintenent un code qui semblait tourner sur Celeron 500 Mhz me donne sur l'exeécution d'un thread la même erreur que toi
    erreur systeme. erreur code: 6.

    l'erreur était chez moi une mauvaise synchronistaion entre la VCL et mon thread

    si ton thread fait des appels à la VCL prend garde a la sinchronisation entre le thread de la VCL et celui que tu a creé

    le mieux ets de crèer un destructeur dans ta classe Thread qui sera appellé de la manière suivante
    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
     
     
    // destructeur
    __fastcall  TMyThread::~TMyThread()
    {
      Terminate();
      WaitFor();
    }
     
    // Constructeur
    __fastcall TMyThread::TMyThread(bool CreateSuspended)
        : TThread(CreateSuspended)
    {
      FreeOnTerminate=false;
    ...// ton code d'initialisation
    }
     
    Appel dans la form Principale
     
    TMyThread * MonThread= new TMyThread(false);
    ..
    //utilisation de ton thread
     
     
    // finalement s destruction
     
    delete  MonThread;



    Salutations

  6. #6
    Sei
    Sei est déconnecté
    Candidat au Club
    Inscrit en
    Septembre 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    bonjour,
    je tiens vraiment a vous remercier tous les deux car ca y est, ca marche!!
    Ca ne plante plus!
    encore merci.

    @+ Sei.

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

Discussions similaires

  1. [Thread] Probleme pour arreter des threads
    Par Djobird dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 15/02/2008, 21h31
  2. Probleme d'arret de thread
    Par X-plode dans le forum Concurrence et multi-thread
    Réponses: 7
    Dernier message: 11/05/2007, 16h45
  3. [Thread] comment arreter un thread qui execute une methode b
    Par Cyber@l dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 04/08/2004, 10h51
  4. Thread Probleme pour l'arret
    Par Raideman dans le forum C++Builder
    Réponses: 3
    Dernier message: 15/04/2004, 12h17
  5. j'arrive pas a arreter mon thread d'arriere-plan
    Par ms91fr dans le forum Langage
    Réponses: 6
    Dernier message: 06/06/2003, 21h36

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