Gestion des références de thread
Cet article contient des informations sur la gestion des références de thread à l’aide des fonctions des fonctions utilitaires légères de l’interpréteur de commandes.
Des situations se produisent lorsqu’un thread parent doit être maintenu actif pendant la durée de vie d’un thread enfant. Par exemple, si un objet COM (Component Object Model) est créé sur le thread parent et marshalé vers le thread enfant, ce thread parent ne peut pas se terminer avant le thread enfant. Pour ce faire, l’interpréteur de commandes fournit ces fonctions.
Utilisez ces fonctions dans votre thread parent comme indiqué ici.
Déclarez une procédure de thread définie par l’application suivant la forme de la fonction ThreadProc .
DWORD WINAPI ThreadProc(LPVOID lpParameter);Dans votre ThreadProc, appelez SHCreateThreadRef pour créer une référence au thread. Cela fournit un pointeur vers une instance de IUnknown. Ce IUnknown utilise la valeur pointée par pcRef pour conserver un décompte de références. Tant que ce nombre est supérieur à 0, le thread reste actif.
En utilisant ce pointeur vers IUnknown, appelez SHSetThreadRef dans votre ThreadProc. Cela définit la référence afin que les appels suivants à SHGetThreadRef aient une valeur à récupérer.
Si votre ThreadProc crée un autre thread, le ThreadProc de ce thread peut appeler SHGetThreadRef avec le pointeur vers IUnknown obtenu par SHCreateThreadRef. Cela incrémente le nombre de références vers lequel pointe le paramètre pcRef dans SHCreateThreadRef.
Créez le thread. Cela s’effectue généralement en appelant SHCreateThread, en passant un pointeur à votre ThreadProc dans le paramètre pfnThreadProc . Transmettez également l' _ _ indicateur de référence de thread CTF dans le paramètre dwFlags . Le thread est actif tant que ThreadProc est en cours d’exécution.
Quand un thread enfant est créé, transmettez l’indicateur CTF _ Ref _ compté dans le paramètre dwFlags de l’appel à son SHCreateThread.
À mesure que les threads enfants sont terminés et libérés, la valeur vers laquelle pointe le pcRef du thread parent diminue. Une fois tous les threads enfants terminés, le ThreadProc d’origine peut terminer et libérer la référence de thread finale, en supprimant le décompte de références à 0. À ce stade, la référence au thread d’origine ouvert par SHCreateThread est libérée et le thread est terminé.
Une autre fonction associée est SHReleaseThreadRef. Cette fonction est appelée par ThreadProc si le thread a été créé à l’aide de SHCreateThread avec l’indicateur de _ _ référence de thread CTF . Toutefois, l’opération ThreadProc n’est pas nécessaire pour le faire implicitement. L’appel de IUnknown :: Release sur le pointeur vers IUnknown obtenu par le biais de SHCreateThreadRef est tout ce qui doit être effectué.