Frage

Hinweis:

  • Mit rohem Win32 CreateTheard () API
  • Keine MFC
  • Eine Schnittstelle ist einfach ein Zeiger auf einen V-Tabelle

Frage:

  • Wie eine Schnittstelle Zeiger auf einen Thread zu übergeben?

Illustration:

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

Viele Grüße

War es hilfreich?

Lösung

Wie weiter unten angegeben, einen COM Interface-Zeiger zwischen Threads vorbei in nicht sicher.

Angenommen, Sie wissen, was Sie tun:

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

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

Thread sichere Version:

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();
}

Andere Tipps

Wenn die Schnittstelle in Ihrer Frage eine COM-Schnittstelle ist der Ansatz von Quassnoi gegeben möglicherweise nicht ausreichend sein. Sie haben die Aufmerksamkeit im Einsatz zum Einfädeln Modell des COM-Objekts zu zahlen. Wenn der sekundäre Thread wird eine separate COM-Wohnung von dem verbinden, die das COM-Objekt wurde erstellt, und wenn das Objekt nicht Apartment-agile , werden Sie diese Schnittstelle Zeiger, so dass der Marschall müssen sekundärer Thread bekommt einen Proxy, und nicht einen direkten Pointer auf das Objekt.

Ein COM-Objekt wird in der Regel gemacht Wohnung-agil durch eine spezielle Implementierung von IMarshal verwenden. Der einfachste Ansatz ist die Free Threaded Marshaler aggregieren.

Einige nützliche Links ...

Update: Über die freethreaded Marshaler ...

Es ist von den Kommentaren zu diesem Thema klar, dass einige Leute würden empfehlen, dass Sie nie die FTM berühren. Während „Effective COM“ ein ausgezeichnetes Buch, ich denke, einige seiner Empfehlungen an Interpretation offen sind. Artikel 33 sagt: „Vorsicht vor dem FTM“; es sagt nicht, „niemals das FTM verwenden“. Sehr weise darauf hin, es Vorsicht vor allem, wenn Ihre Wohnung-agile Objekt Verweise auf andere Objekte hält, weil sie vielleicht nicht im Apartment-agil sein. So wirklich der Rat: denken Sie sorgfältig, wenn Wohnung-agile Objekte bauen, ob sie den FTM verwenden, um ihre Beweglichkeit zu erreichen. Wenn Sie sicher sind, können Sie eine Wohnung-agile Objekt bauen, sehe ich keinen Grund, warum Sie das FTM nicht zu erreichen verwenden würde.

Sie im Grunde müssen folgendes tun:

  • CoMashalInterThreadInterfaceInStream ==> Sie erhalten eine IStream-Schnittstelle.
  • passieren, dass die IStream auf den Faden, z.B. wie gesagt Quassnoi.
  • in SecondaryThread, rufen CoGetInterfaceAndReleaseStream die Schnittstelle zu bekommen (oder einen Proxy es, falls erforderlich).

Sie lassen Sie die IStream-Schnittstelle nicht, es sei denn der Thread Erstellung fehlschlägt, und beenden Sie den Faden nicht bis yu CoGetInterfaceAndReleaseStream genannt haben.

COM-Laufzeit wird die Proxy automatisch für Sie erstellen. Der Proxy wird sichergestellt, dass z.B. eine Wohnung-threaded COM-Komponente wird auf dem Thread aufgerufen, die es erstellt. Dies erfordert jedoch auch, dass:

  • Die Schnittstelle ist IDispatch oder Proxy / Stub-Komponenten werden für die Schnittstelle registriert
  • die threadthat die Komponente eine Nachrichtenschleife erstellt und verarbeitet Nachrichten
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top