Gerenciando referências de thread
Este artigo contém informações sobre o gerenciamento de referências de thread usando funções das funções de utilitário leve do Shell.
As situações surgem quando um thread pai deve ser mantido ativo durante o tempo de vida de um thread filho. Por exemplo, se um objeto COM (Component Object Model) for criado no thread pai e realizado em marshaling para o thread filho, esse thread pai não poderá terminar antes do thread filho. Para fazer isso, o Shell fornece essas funções.
Use essas funções no thread pai, conforme descrito aqui.
Declare um procedimento de thread definido pelo aplicativo seguindo a forma da função ThreadProc .
DWORD WINAPI ThreadProc(LPVOID lpParameter);
Em seu ThreadProc, chame SHCreateThreadRef para criar uma referência ao thread. Isso fornece um ponteiro para uma instância do IUnknown. Esse IUnknown usa o valor apontado por pcRef para manter uma contagem de referência. Enquanto essa contagem for maior que 0, o thread permanecerá ativo.
Usando esse ponteiro para IUnknown, chame SHSetThreadRef em seu ThreadProc. Isso define a referência para que as chamadas subsequentes para SHGetThreadRef tenham algo a recuperar.
Se o ThreadProc criar outro thread, o ThreadProc desse thread poderá chamar SHGetThreadRef com o ponteiro para IUnknown obtido por SHCreateThreadRef. Isso incrementa a contagem de referência apontada pelo parâmetro pcRef em SHCreateThreadRef.
Crie o thread. Isso geralmente é feito chamando SHCreateThread, passando um ponteiro para o ThreadProc no parâmetro pfnThreadProc . Passe também o sinalizador CTF_THREAD_REF no parâmetro dwFlags . O thread está ativo enquanto ThreadProc estiver em execução.
Quando um thread filho for criado, passe o sinalizador CTF_REF_COUNTED no parâmetro dwFlags na chamada para seu SHCreateThread.
À medida que os threads filho são concluídos e liberados, o valor apontado pelo pcRef do thread pai diminui. Depois que todos os threads filho forem concluídos, o ThreadProc original poderá concluir e liberar a referência final do thread, descartando a contagem de referência para 0. Nesse ponto, a referência ao thread original aberto por SHCreateThread é lançada e o thread concluído.
Outra função relacionada é SHReleaseThreadRef. Essa função será chamada pelo ThreadProc se o thread tiver sido criado usando SHCreateThread com o sinalizador CTF_THREAD_REF . No entanto, o ThreadProc não é necessário para fazer isso implicitamente. Chamar IUnknown::Release no ponteiro para IUnknown obtido por meio de SHCreateThreadRef é tudo o que precisa ser feito.