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�
    Futur Membre du Club
    Inscrit en
    Septembre 2002
    Messages
    4
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 4
    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 averti
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    61
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 61
    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�
    Futur Membre du Club
    Inscrit en
    Septembre 2002
    Messages
    4
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 4
    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 averti
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    61
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 61
    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 Expert
    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
    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
    vous trouverez mes tutoriels � l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les r�gles du forum

  6. #6
    Sei
    Sei est d�connect�
    Futur Membre du Club
    Inscrit en
    Septembre 2002
    Messages
    4
    D�tails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 4
    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