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 averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    25
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 25
    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 �m�rite
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    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