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