Bonjour,

Le thread principal de mon programme cr�e une collection et en exploite le contenu.
Le remplissage de cette collection pouvant �tre long (donn�es provenant de requ�tes http), j'ai cr�� un thread secondaire pour g�rer la r�cup�ration des donn�es.
J'ai adopt� un concept qui fonctionne (sur ma machine de dev, en version debug) mais je ne suis pas s�r que ce soit vraiment thread-safe.
Que pensez-vous du fonctionnement d�crit ci-dessous ? :

MainThread :
- cr�ation de la collection
- cr�ation d'un objet sdk (permet l'acc�s aux donn�es)
- cr�ation du thread en lui passant en param�tres dans le constructeur de la classe un pointeur sur la collection et un autre sur l'objet sdk

Thread secondaire
- dans le constructeur, copie des pointeurs pass�s en param�tre dans des pointeurs locaux
- dans la m�thode execute(), appel des diff�rentes fonctions permettant de r�cup�rer les donn�es � l'aide du pointeur local sur l'objet sdk
- ajout des items directement dans la collection � l'aide du pointeur local sur la collection

Je pr�cise qu'il n'y a qu'un seul thread secondaire et que les donn�es ajout�es � la collection par le thread secondaire ne sont exploit�es par le thread principal qu'une fois le thread termin�.

Voil� en r�sum� le code utilis� :

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
//-----------------------------------------------------------------------------
threadconfig.h
//-----------------------------------------------------------------------------
class TThreadGetConfig : public TThread
{
private:
	pSDK FSDK;
	pControllersCollection FSubControllers;
 
protected:
	void __fastcall Execute();
 
public:
	__fastcall TThreadGetConfig(pSDK paramSDK, pControllersCollection paramSubControllers);
};
 
 
//-----------------------------------------------------------------------------
threadconfig.cpp
//-----------------------------------------------------------------------------
 
__fastcall TThreadGetConfig::TThreadGetConfig(pSDK paramSDK, pControllersCollection paramSubControllers)
: TThread(true)
{
	FSDK = paramSDK;
	FSubControllers = paramSubControllers;
 
	FreeOnTerminate = true;
}
 
void __fastcall TThreadGetConfig::Execute()
{
	ReturnValue = (GetSiteConfig() ? 0:1);
	Terminate();
}
 
bool __fastcall TThreadGetConfig::GetSiteConfig()
{
	std::vector<TSDK_ConfigData>::iterator ptr_subctrl;
   ...
 
	try
	{
		if (!SDK->Connected)
			throw Exception("sdk error");
 
		//get data from sdk calls
		...
 
		for (ptr_subctrl = subcontrollers.begin(); ptr_subctrl < subcontrollers.end(); ptr_subctrl++)
		{
			pControllerItem subctrl_item = (pControllerItem)SubControllers->Add();
			subctrl_item->Data->Id = ptr_subctrl->id;
			subctrl_item->Data->Serial = ptr_subctrl->serial;
			...
		}
 
		return true;
	}
	catch(...)
	{
	}
 
	return false;
}
 
 
//-----------------------------------------------------------------------------
main.h
//-----------------------------------------------------------------------------
 
class TfrmMain : public TForm
{
__published:
   ...
private:
   TThreadGetConfig *thrdGetConfig;
	pSDK FSDK;
	pControllersCollection FSubControllers;
}
 
 
//-----------------------------------------------------------------------------
main.cpp
//-----------------------------------------------------------------------------
 
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
	: TForm(Owner)
{
	FSubControllers = new TControllersCollection(NULL);
	FSDK = new TSDK();
}
 
void __fastcall TfrmMain::StartThread()
{
	thrdGetConfig = new TThreadGetConfig(
			this->SDK,
			this->SubControllers);
 
	thrdGetConfig->Resume();
}
Ce code est-il correct ?
Merci pour votre aide