6

ノート:

  • 生の Win32 CreateTard() APIの使用
  • MFCなし
  • インターフェイスは単に vtable へのポインタです

質問:

  • インターフェイスポインタをスレッドに渡す方法は?

図:

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

よろしく

4

3 に答える 3

8

COM以下で述べたように、スレッド間のインターフェイス ポインターの受け渡しは安全ではありません。

あなたが何をしているのかを知っていると仮定します:

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

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

スレッドセーフバージョン:

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();
}
于 2009-02-04T10:23:39.570 に答える
7

質問のインターフェイスが COM インターフェイスの場合、Quassnoi が提供するアプローチは十分ではない可能性があります。使用中の COM オブジェクトのスレッド モデルに注意する必要があります。セカンダリ スレッドが、COM オブジェクトが作成された COM アパートメントとは別の COM アパートメントに参加する場合、およびそのオブジェクトがapartment-agileでない場合、セカンダリ スレッドがプロキシを取得できるように、そのインターフェイス ポインターをマーシャリングする必要があります。オブジェクトへの直接ポインタではありません。

COM オブジェクトは通常、IMarshal の特別な実装を使用してアパートメント アジャイルになります。最も簡単な方法は、フリー スレッド マーシャラーを集約することです。

いくつかの便利なリンク...

更新: フリースレッド マーシャラーについて...

このトピックに関するコメントから、FTM に決して触れないように勧める人がいることは明らかです。「Effective COM」は優れた本ですが、その推奨事項のいくつかは解釈の余地があると思います。項目 33 には「FTM に注意してください」と書かれています。「FTMを使用しないでください」とは言いません。非常に賢明なことに、アパートメント アジャイル オブジェクトが他のオブジェクトへの参照を保持している場合は特に注意が必要です。つまり、アパートメント アジャイル オブジェクトを構築するときは、FTM を使用してアジャイル性を実現するかどうかにかかわらず、慎重に検討してください。アパートメント アジャイル オブジェクトを構築できると確信しているなら、それを実現するために FTM を使用しない理由はないと思います。

于 2009-02-04T13:58:51.510 に答える