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 :

pause et reprise de thread


Sujet :

C++Builder

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 71
    Points : 61
    Points
    61
    Par défaut pause et reprise de thread
    Salut !

    Bon je developpe un programme qui doit piloter un moteurs pas à pas. Pour cela j'ai une interface qui lance un thread contenant les ordres de déplacements des moteurs. Sur cette interface je veux mettre un bouton pause/reprise et un bouton arrêt d'urgence. Mon problème est le suivant : l'appel de la méthode suspend () du thread est inefficasse, le mouvement continue toujours.

    Merci de votre aide.

    code de l'interface :
    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
     
     
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
     
    void __fastcall TForm1::threadClick(TObject *Sender)
    {
     generationthread () ;
    }
    void __fastcall TForm1::killerClick(TObject *Sender)
    {
    try {
    monthread->Terminate() ; }
    catch ( const EThread &e ) { ShowMessage ("thread fini avant"); return ;}
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::pauseClick(TObject *Sender)
    {
      //compteur initialisé à 0 dans le header
    try {
    if ( compteur == 0 ) { monthread->Suspend(); compteur++ ; }
       else  { monthread->Resume() ; compteur-- ; }
       }
    catch ( const EThread &e ) { ShowMessage ("thread inexistant");}
    }
    //---------------------------------------------------------------------------
    void TForm1::generationthread ()  //creation du thread
    {
      monthread = new essais ( true ) ;
      monthread->FreeOnTerminate = true ;
      monthread->Resume() ;
    }
    et le code du thread :
    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
     
    __fastcall essais::essais(bool CreateSuspended)
            : TThread(CreateSuspended)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall essais::Execute()
    {
    if (!Terminated){
     
    a.ymove(-2000) ; // ordre de bouger à la position -2000
    a.yfinmove() ;  //attente bloquante de fin de mouvement
    Sleep ( 500 ) ;
    }
     
    if (!Terminated){
     
    a.ymove(0) ; //ordre de revenir à la position de départ
    a.yfinmove() ;  //attente bloquante de fin de mouvement
    Sleep ( 500 ) ;
     
    }
     
    //le thread appel une méthode de l'interface pour générer un nouveau thread
    // identique
    if (!Terminated){ Form1->generationthread() ; }
    }

  2. #2
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut
    Je n'ai peut être pas tout compris, mais tu as marqué toi même que tu avais une méthode bloquante dans ton thread.

    C'est normal que le suspend soit inefficace. En tout cas moi je m'étais posé la même question lorsque je voulais terminer mon thread

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 71
    Points : 61
    Points
    61
    Par défaut
    Tu veux dire que si le prog principal appel la méthode suspend du thread et que celui ci est en attente de quelque chose ( en l'occurence d'une réponse de mon interface moteur ), le thread ne se met pas en pause ( cad que suspend n'est pas traité ) ???

  4. #4
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut
    oui, c'est ça Moi j'appelé la méthode Terminate, je voulais stopper mon thread, or il était en attente de lecture sur un socket.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 71
    Points : 61
    Points
    61
    Par défaut
    Bon j'ai peut être trouvé la parade avant chaque instruction de mouvement moteur je place la ligne de code suivante dans le thread :

    Bien sur c'est efficase mais j'aimerai connaitre une technique pour éviter l'attente active qui consomme du temps CPU pour rien.

    merci

  6. #6
    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
    utilise les objects de synchonisation de Win32
    d'autre part c'est assez dangereux d'appeler une méthode du thread Principal VCL sans synchronisation,
    le mieux est d'utilisser un PostMessage depuis ton thread
    tu peux voir cette technique depuis mon tut

    http://djmsoftware.developpez.com/PrintMonitor/
    cordialement
    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

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

Discussions similaires

  1. Threads : pause et reprise avec JButton
    Par bioinfx6996 dans le forum Général Java
    Réponses: 5
    Dernier message: 02/04/2008, 16h39
  2. [Visual C#] Reprise de threads bloqués
    Par levalp dans le forum Windows Forms
    Réponses: 4
    Dernier message: 22/02/2008, 22h25
  3. ordre de reprise de threads bloqués
    Par duaner dans le forum C#
    Réponses: 19
    Dernier message: 05/07/2007, 15h52
  4. Réponses: 2
    Dernier message: 05/03/2007, 16h45
  5. Pause et reprise d'un thread
    Par raggadoll dans le forum Linux
    Réponses: 5
    Dernier message: 03/07/2003, 20h22

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