문제

메모:

  • 사용 원시 Win32 CreateTheArd () 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

문안 인사

도움이 되었습니까?

해결책

아래에 언급 된 바와 같이, a 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();
}

다른 팁

질문의 인터페이스가 COM 인터페이스 인 경우 Quassnoi가 제공 한 접근 방식만으로는 충분하지 않을 수 있습니다. 사용중인 COM 객체의 스레딩 모델에주의를 기울여야합니다. 보조 스레드가 COM 객체가 생성 된 것과 별도의 COM 아파트에 합류하는 경우 아파트 에일, 보조 스레드가 대변을 얻지 않고 객체에 대한 직접적인 포인터가 아닌 인터페이스 포인터를 마샬링해야합니다.

COM 객체는 일반적으로 Imarshal의 특별 구현을 사용하여 아파트에 걸쳐 만들어집니다. 가장 간단한 접근법은 프리 스레드 마샬러를 집계하는 것입니다.

유용한 링크 ...

업데이트 : 프리 스레드 마샬에 대해 ...

이 주제에 대한 의견에서 일부 사람들은 FTM을 만지지 않는 것이 좋습니다. "효과적인 com"은 훌륭한 책이지만, 그 권장 사항 중 일부는 해석에 개방적이라고 생각합니다. 항목 33은 "FTM을 조심해야한다"고 말합니다. "FTM을 사용하지 마십시오"라고 말하지 않습니다. 매우 현명하게 그것은 특히 아파트에 걸린 물체가 다른 물체에 대한 언급을 가지고있을 때주의를 기울여야합니다. 그래서 실제로 조언은 다음과 같습니다. 아파트에 걸린 물건을 만들 때 신중하게 생각하십시오. 아파트에 걸린 물체를 만들 수 있다고 확신한다면 FTM을 사용하여이를 달성하지 못하는 이유는 없습니다.

기본적으로 다음을 수행해야합니다.

  • CoMashalInterThreadInterfaceInStream ==> 당신은 istream 인터페이스를 얻습니다.
  • Quassnoi가 말한 것처럼 그 istream을 실로 전달합니다.
  • Secondarythread에서 전화하십시오 CoGetInterfaceAndReleaseStream 인터페이스를 얻기 위해 (또는 필요한 경우 프록시).

스레드가 실패하지 않는 한 Istream 인터페이스를 해제하지 말고 Yu가 전화를 걸 때까지 스레드를 종료하지 마십시오. CoGetInterfaceAndReleaseStream.

com 런타임은 자동으로 프록시를 만듭니다. 프록시는 예를 들어 아파트 스레드 COM 구성 요소를 생성 한 스레드에서 호출되도록합니다. 그러나 이것은 또한 다음을 요구합니다.

  • 인터페이스는 idispatch 또는 프록시/스터브 구성 요소가 인터페이스에 등록되어 있습니다.
  • 구성 요소에 생성 된 스레드에 메시지 루프가 있고 메시지를 처리합니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top