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:
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:
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