Bonjour,
Je voudrais savoir quelle est la méthode la plus simple pour stocker des variable dans un thread ?
Je veux dire faire l’équivalent de la fonction API SetLastError,GetLastError, et de visualstudio srand ,rand.
Comment faire ?
Merci beaucoup.
Bonjour,
Je voudrais savoir quelle est la méthode la plus simple pour stocker des variable dans un thread ?
Je veux dire faire l’équivalent de la fonction API SetLastError,GetLastError, et de visualstudio srand ,rand.
Comment faire ?
Merci beaucoup.
La plus simple, mais pas forcément la plus propre:
Code Visual C++ : Sélectionner tout - Visualiser dans une fenêtre à part __declspec(thread) int g_myGlobalVar;
La façon "propre" implique elle aussi l'usage d'une variable globale:
Code C : 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 TLS_INDEX g_myIndex = TlsAlloc(); void MyCallbackFunction() { MyStructure * pMyStructure = (MyStructure *)TlsGetValue(g_myIndex); ... } DWORD STDCALL ThreadProc(void*) { MyStructure *pMyStructure = CreateMyStructure(); TlsSetValue(g_myIndex, pMyStructure); PoorlyThoughtCallbackUsingFunction(&MyCallbackFunction); DestroyMyStructure(pMyStructure); TlsSetValue(g_myIndex, NULL); return 0; }
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
OK, merci,
mais existe-t-il l'équivalent de ?
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 BOOL TlsSetValueByThreadID( DWORD ThreadID, DWORD dwTlsIndex, LPVOID lpTlsValue );
Cette fonction n'existe pas, c'est un exemple.
Pour autant que je sache, non, rien de la sorte: Les fonctions sur le TLS (hormis TlsAlloc et TlsFree) n'affectent que le thread courant.
C'est ce qui rend l'initialisation et le nettoyage un peu problématique.
Un thread va devoir nettoyer lui-même son slot TLS en fin de traitement, s'il y a mis un pointeur vers de la mémoire allouée dont il est le seul propriétaire. C'est ce que j'ai mis dans mon code d'exemple:
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 DestroyMyStructure(pMyStructure); TlsSetValue(g_myIndex, NULL);
Par contre, les threads peuvent toujours communiquer autrement: Si un thread possède une boucle de messages et une fenêtre (qui peut être une fenêtre message-only invisible), un SendMessage() permettrait de faire des appels synchrones, y compris ordonner à un thread de nettoyer son TLS...
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Partager