Pregunta

Nota:

  • Uso Win32 CreateTheard () API prima
  • No se MFC
  • Una interfaz es simplemente un puntero a una vtable

Pregunta:

  • Cómo pasar un puntero de interfaz a un hilo?

Ejemplo:

IS8Simulation *pis8 = NULL;

...

CoCreateInstance(
                 clsid,
                 NULL,
                 CLSCTX_LOCAL_SERVER,
                 __uuidof(IS8Simulation),
                 (void **) &pis8);



...

hThread = CreateThread(
                NULL,
                0,
                SecondaryThread,
                //interface pointer pis8
                0,
                &dwGenericThreadID);

...

DWORD WINAPI SecondaryThread(LPVOID iValue)
{
    //using iValue accordingly
    //E.g.: iValue->Open

Regards

¿Fue útil?

Solución

Como se indica a continuación, pasando un puntero de interfaz COM entre hilos en no es seguro.

Suponiendo que usted sabe lo que está haciendo:

hThread = CreateThread(
                NULL,
                        0,
                        SecondaryThread,
                        (LPVOID) pis8
                        0,
                        &dwGenericThreadID);

DWORD WINAPI SecondaryThread(LPVOID iValue)
{
   ((IS8Simulation*) iValue)->Open();
}

Tema versión segura:

void MainThread()
{
    IStream* psis8;
    HRESULT res = CoMarshalInterThreadInterfaceInStream (IID_IS8SIMULATION, pis8, &psis8);
    if (FAILED(res))
         return;
    hThread = CreateThread(
                NULL,
                0,
                SecondaryThread,
                (LPVOID) psis8
                0,
                &dwGenericThreadID
          );
}

DWORD WINAPI SecondaryThread(LPVOID iValue)
{
   IS8Simulation* pis8;
   HRESULT res = CoGetInterfaceAndReleaseStream((IStream*) iValue, IID_IS8SIMULATION, &pis8);
   if (FAILED(res))
      return (DWORD) res;
   pis8->Open();
}

Otros consejos

Si la interfaz en su pregunta es una interfaz COM, el enfoque dado por Quassnoi podría no ser suficiente. Tienes que prestar atención al modelo de enhebrado del objeto COM en uso. Si el subproceso secundario se unirá a un apartamento COM separada de la que su objeto COM fue creado en, y si ese objeto no es apartamento de ágil , usted tendrá que reunir esa interfaz para que el puntero rosca secundaria consigue un proxy, y no un puntero directo al objeto.

Un objeto COM se hace normalmente apartamento de ágil mediante el uso de una implementación especial del IMarshal. El método más sencillo consiste en agregar el Contador de Subproceso libre.

Algunos enlaces útiles ...

Actualización: Sobre el contador de referencias de Libre roscado ...

Es claro a partir de los comentarios sobre este tema que algunas personas recomiendan que nunca toca la FTM. Mientras que "COM eficaz" es un libro excelente, creo que algunas de sus recomendaciones están abiertos a la interpretación. Artículo 33 dice "Cuidado con el FTM"; no dice "Nunca utilizar el FTM". Muy sabiamente se aconseja precaución en especial cuando su objeto apartamento-ágil mantiene referencias a otros objetos, ya que podrían no ser apartamento-ágil. Así que en realidad el consejo es: pensar cuidadosamente en la construcción de objetos de apartamentos-ágil, sean o no utilizan el FTM para lograr su agilidad. Si está seguro de que se puede construir un objeto apartamento-ágil, no veo ninguna razón por la que no se usará la FTM para lograrlo.

Es, básicamente, tiene que hacer lo siguiente:

  • CoMashalInterThreadInterfaceInStream ==> se obtiene una interfaz IStream.
  • pasar que IStream a la rosca, por ejemplo como dijo Quassnoi.
  • en SecondaryThread, llame CoGetInterfaceAndReleaseStream para obtener la interfaz (o un proxy para que, si es necesario).

No soltar la interfaz IStream a no ser que la creación de la rosca falla, y no sale del hilo hasta yu han llamado <=>.

tiempo de ejecución COM va a crear el proxy de forma automática. El proxy asegura que, por ejemplo, un componente COM de subprocesamiento se llama en el hilo que lo creó. Sin embargo, esto también requiere que:

  • La interfaz es IDispatch, o proxy / componentes de código auxiliar se registran para la interfaz
  • el threadthat creado el componente tiene un bucle de mensajes y procesa mensajes
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top