IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Thread et variables


Sujet :

Windows

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    915
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Mai 2011
    Messages : 915
    Points : 85
    Points
    85
    Par défaut Thread et variables
    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.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    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;
    }

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    915
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Mai 2011
    Messages : 915
    Points : 85
    Points
    85
    Par défaut
    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.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    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...

Discussions similaires

  1. threads et variables globales
    Par deb75 dans le forum C
    Réponses: 3
    Dernier message: 18/12/2007, 19h44
  2. [MT] thread et variable globale
    Par r0d dans le forum Threads & Processus
    Réponses: 5
    Dernier message: 15/08/2007, 02h18
  3. threads et variables partagées
    Par Mr_Brown dans le forum Langage
    Réponses: 3
    Dernier message: 25/04/2007, 15h30
  4. threads et variables communes
    Par buzzz dans le forum Windows
    Réponses: 3
    Dernier message: 21/02/2005, 13h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo