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 :

Problème de gestion multithreading de TProgressBar gérée par TThread


Sujet :

C++Builder

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 25
    Points : 16
    Points
    16
    Par défaut Problème de gestion multithreading de TProgressBar gérée par TThread
    Bonjour,

    Mon application (poste client) appelle un serveur par le biais d'un post. le problème est que les appels peuvent être longs dans certains cas.
    J'aimerai dans ces cas mettre en place un système d'animation par le biais d'une progressbar pour que l'application ne freeze pas.

    Pour cela j'ai créé une classe héritant de TThread.
    Dans cette classe j'instancie une form contenant ma progressbar de manière à ce que lorsque le post est fait au serveur, la progressbar puisse évoluer puisqu'elle est sur une thread différente.

    Le .h
    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
     
    class TThreadProgressBar : public TThread
    {
    private:
       static TThreadProgressBar* _threadProgressBar;
       TfrmProgressBar* _s_fiche;
     
       void __fastcall CreerForm();
       void __fastcall DetruireForm();
    public:
       __fastcall  TThreadProgressBar(bool CreateSuspended);
       void __fastcall Execute();
     
       static void s_startAnimation();
       static void s_stopAnimation();
    };
    Le .cpp
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    TThreadProgressBar* TThreadProgressBar::_threadProgressBar = NULL;
     
    //---------------------------------------------------------------------------
    //---------------------------------------------------------------------------
    __fastcall TThreadProgressBar::TThreadProgressBar(bool CreateSuspended)
    :  TThread(CreateSuspended)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TThreadProgressBar::CreerForm()
    {
       if ( !_s_fiche )
       {
          _s_fiche = new TfrmProgressBar( NULL );
          _s_fiche->Show();
          _s_fiche->FormStyle = fsStayOnTop;
       }
    }
    //---------------------------------------------------------------------------
    void __fastcall TThreadProgressBar::DetruireForm()
    {
       delete _s_fiche;
    }
    //---------------------------------------------------------------------------
    void __fastcall TThreadProgressBar::Execute()
    {
       Synchronize( CreerForm );
       while (! Terminated)
       {
          Forms::Application->ProcessMessages();
       }
       Synchronize( DetruireForm );
    }
    //---------------------------------------------------------------------------
    void TThreadProgressBar::s_startAnimation()
    {
       if ( !_threadProgressBar )
       {
          _threadProgressBar = new TThreadProgressBar(false);
       }
    }
    //---------------------------------------------------------------------------
    void TThreadProgressBar::s_stopAnimation()
    {
       if ( _threadProgressBar )
       {
          delete _threadProgressBar;
          _threadProgressBar = NULL;
       }
    }
    Le problème est que lors de l'exécution de la méthode Execute() l'appel de la fonction Synchronize( CreerForm ); freeze l'application et n'appelle pas la fonction CreerForm(). Cet appel n'est que fait au retour du post au serveur.

    En gros, il n'y a pas d'intéret de tthread puisque ça ne fonctionne pas...
    Merci pour votre aide.

    Michael

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    Hello,

    Je suppose que tu voudrais faire dans le thread principal de ton appli quelque chose comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TThreadProgressBar::s_startAnimation();
    CommAvecLeServeur();
    TThreadProgressBar::s_stopAnimation();
    Le problème est que les appels à Synchronize se rebranchent en interne sur le thread principal. Si CommAvecLeServeur() est bloquante, Synchronize ne peut pas s'exécuter.

    Au pire, tu peux lancer CreerForm() dans le constructeur de ton thread (donc dans le contexte du thread principal).

    Il vaudrait peut-être mieux voir le problème à l'envers:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    InitProgressBar();
    <Démarrer un thread de comm avec le serveur>
    while (!ThreadCommServeurTermine)
    {
      FaireAvancerProgressBar();
      Application->ProcessMessages();
    }
    FinProgressBar();

Discussions similaires

  1. Réponses: 18
    Dernier message: 13/03/2015, 20h39
  2. Problème de gestion d'un octree
    Par MaxPayne dans le forum OpenGL
    Réponses: 9
    Dernier message: 06/04/2005, 10h17
  3. problème de gestion de fenêtre
    Par clemsouz dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 03/11/2004, 14h35
  4. Problème de gestion fichiers
    Par glutock dans le forum ASP
    Réponses: 2
    Dernier message: 08/04/2004, 11h55
  5. [TFrame] Problème de gestion du OnMouseDown avec une Frame
    Par xherault dans le forum Composants VCL
    Réponses: 5
    Dernier message: 23/05/2003, 15h35

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