Compartir a través de


Administración de referencias de subprocesos

Este artículo contiene información sobre la administración de referencias de subprocesos mediante funciones de las funciones de utilidad ligera de Shell.

Las situaciones surgen cuando un subproceso primario debe mantenerse activo durante la vigencia de un subproceso secundario. Por ejemplo, si se crea un objeto Component Object Model (COM) en el subproceso primario y se serializa en el subproceso secundario, ese subproceso primario no puede finalizar antes del subproceso secundario. Para ello, shell proporciona estas funciones.

Use estas funciones en el subproceso primario como se describe aquí.

  1. Declare un procedimiento de subproceso definido por la aplicación siguiendo la forma de la función ThreadProc .

    DWORD WINAPI ThreadProc(LPVOID lpParameter);
    
  2. En threadProc, llame a SHCreateThreadRef para crear una referencia al subproceso. Esto proporciona un puntero a una instancia de IUnknown. Este IUnknown usa el valor al que apunta pcRef para mantener un recuento de referencias. Siempre que este recuento sea mayor que 0, el subproceso permanece activo.

  3. Con ese puntero a IUnknown, llame a SHSetThreadRef en threadProc. Esto establece la referencia para que las llamadas posteriores a SHGetThreadRef tengan algo que recuperar.

  4. Si threadProc crea otro subproceso, threadProc puede llamar a SHGetThreadRef con el puntero a IUnknown obtenido por SHCreateThreadRef. Esto incrementa el recuento de referencias al que apunta el parámetro pcRef en SHCreateThreadRef.

  5. Cree el subproceso. Normalmente, esto se realiza llamando a SHCreateThread, pasando un puntero a ThreadProc en el parámetro pfnThreadProc . Pase también la marca CTF_THREAD_REF en el parámetro dwFlags . El subproceso está activo siempre que threadProc se esté ejecutando.

  6. Cuando se crea un subproceso secundario, pase la marca CTF_REF_COUNTED en el parámetro dwFlags de la llamada a su SHCreateThread.

  7. A medida que se completan los subprocesos secundarios y se liberan, el valor al que apunta la clase pcRef del subproceso primario disminuye. Una vez completados todos los subprocesos secundarios, threadProc original puede completarse y liberar la referencia final del subproceso, quitando el recuento de referencias a 0. En ese momento, se libera la referencia al subproceso original abierto por SHCreateThread y se completa el subproceso.

Otra función relacionada es SHReleaseThreadRef. ThreadProc llama a esta función si el subproceso se ha creado mediante SHCreateThread con la marca CTF_THREAD_REF. Sin embargo, threadProc no es necesario hacerlo implícitamente. Llamar a IUnknown::Release en el puntero a IUnknown obtenido a través de SHCreateThreadRef es todo lo que debe realizarse.