Bonjour,

Suite � ce sujet, je me suis pench� sur les threads. Comme j'ai de nombreuses questions � propos de l'objet TThread de C++ Builder 6, je me permets de cr�er un sujet � part afin de poser mes diverses questions. J'ai cherch� dans la FAQ, j'ai lu le tutoriel sur les threads et l'aide de C++ Builder mais je n'ai pas trouv� de r�ponses...

Au final, je souhaiterais r�aliser un objet contenant un TTimer et un TThread, qui ex�cuterait une fonction � une heure donn�e. J'ai commenc� le d�veloppement de l'objet, le TTimer fonctionne, et � une heure donn�e, il est pr�t � ex�cuter ce que je souhaite.

Voici mes questions :

- peut-on choisir le moment de l'ex�cution d'un thread ? la m�thode Execute doit �tre private donc on ne peut pas le lancer quand on le souhaite... J'ai remarqu� que lors de la cr�ation d'une instance de TThread avec new, celui-ci �tait lanc� � la FIN de la fonction ayant cr�� cette instance (voir le code exemple + bas). On peut le cr�er en le mettant par d�faut en mode "suspendu", et faire un "resume" d�s qu'on souhaite le lancer, mais dans ce cas... on ne peut le lancer qu'une fois !

- o� mettre les appels au destructeur du thread "delete MonThread1" ? On ne peut pas le mettre apr�s le new, sinon le thread est d�truit avant m�me d'avoir �t� lanc�... Faut-il utiliser FreeOnTerminate ? Cela correspond-t'il � sa destruction comme un delete � la fin de son ex�cution ?

- pour l'objet que je veux cr�er, comme un thread semble n�cessairement �tre d�marr� avec un new, peut �tre faut-il que j'envoie � mon objet l'adresse de la fonction � ex�cuter, et non l'adresse d'un thread en le laissant suspend() lors de l'initialisation de l'objet ?

Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
class TimerPlanning : public TTimer
{
  private:
        void __fastcall VerifierTimer(TObject *);
 
  public:
        TThread *Thread;
 
        unsigned short PlanningHeure;   
        unsigned short PlanningMinute;  
 
       __fastcall TimerPlanning(TComponent *AOwner, unsigned short planning_heure, unsigned short planning_minute, TThread *thread);
};


J'ai �galement mis en place un programme pour tester les threads, et notamment le fait qu'il se lance A LA FIN de la fonction dans laquelle ils sont appel�s :

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
52
//---------------------------------------------------------------------------
// 1er thread
//---------------------------------------------------------------------------
__fastcall TMonThread1::TMonThread1(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
 
void __fastcall TMonThread1::Execute()
{
for(int i=0;i<500;i++)
{
        Form1->Label1->Caption = String(i);
        Sleep(10);
        Application->ProcessMessages();
}
}
 
//---------------------------------------------------------------------------
// 2ème thread
//---------------------------------------------------------------------------
__fastcall TMonThread2::TMonThread2(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
 
void __fastcall TMonThread2::Execute()
{
for(int i=0;i<500;i++)
{
        Form1->Label2->Caption = String(i);
        Sleep(10);
        Application->ProcessMessages();
}
}
 
//---------------------------------------------------------------------------
// Bouton pour lancer le 1er thread
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TMonThread1 *MonThread = new TMonThread1(false);
}
 
//---------------------------------------------------------------------------
// Bouton pour lancer le 2ème thread
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
TMonThread2 *MonThread = new TMonThread2(false);
Sleep(3000);
}
Ici, si j'appuie sur Button1, mon 1er thread se lance bien. Par contre, quand j'appuie sur Button2, � cause du "Sleep(3000)", le 2�me thread ne se lance pas juste apr�s le new, le 1er thread est bloqu� pendant les 3000 ms, puis les 2 threads sont relanc�s. Qu'est-ce qui se passe ?? Je pensais que d�s que l'on faisait un new thread, celui-ci �tait ex�cut� ! Il ne s'ex�cute alors qu'APRES la FIN de la fonction qui l'a lanc�e ? C'est bizarre, non ? J'ai essay� avec un Application->ProcessMessages(); juste apr�s le new, �a ne change rien...

Je sais que le Sleep(3000) est un �v�nement bloquant. Mais si je mets par exemple � la place Form1->Label2->Caption = "fini", "fini" appara�t juste avant le lancement du thread... puisque la fonction Button2Click est execut�e enti�rement avec son lancement... bizarre, alors que dans le code l'affichage de "fini" est apr�s le thread !

Auriez-vous des id�es pour ces questions et probl�mes ? Evidemment, si vous ne pouvez pas r�pondre � toutes mes questions, je souhaite bien quelques explications sur les points que vous connaissez...

Si je ne suis pas clair, merci de me le faire savoir, j'essaierai de corriger mon message rapidement, car c'est assez urgent...

En vous remerciant par avance.