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
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 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 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.
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; } }
En gros, il n'y a pas d'intéret de tthread puisque ça ne fonctionne pas...
Merci pour votre aide.
Michael
Partager