질문에 대한 직접적인 해답은 아니지만 나 자신이 게시하는 것을 도울 수 없습니다.
Com의 황금 시대의 훌륭한 MSKB 기사가 있습니다. 정보 : 올레 스레딩 모델의 설명 및 작업. 여전히 거기에 있으며 모든 관련 정보가 있습니다. 요점은 규칙을 따르는 경우 마샬링이 있는지 여부에 대해 걱정해서는 안됩니다.. 객체를 그냥 등록하십시오 ThreadingModel=Both
, 프리 스레드 마샬을 집계하십시오 CoCreateFreeThreadedMarshaler
, 그리고 끝납니다. Com은 필요한 경우 가능한 한 최선의 방법으로 마샬링을 할 것입니다. 클라이언트의 아파트 모델에 따라 클라이언트 코드는 규칙을 따르는 경우 인터페이스에 대한 직접 포인터를받을 수 있습니다.
인터페이스의 메소드가 호출 될 때받을 수있는 "Alien"인터페이스는 동일한 스레드에 머무르기 때문에 통화 범위에서 유효합니다. 저장할 필요가 없다면 그게 전부입니다.
그러나 "Alien"인터페이스를 캐시 해야하는 경우이 작업을 수행하는 올바른 방법은 사용하는 것입니다. CoMarshalInterThreadInterfaceInStream
/CoGetInterfaceAndReleaseStream
:
그것을 보관하려면 :
- 임계 섹션을 입력하십시오.
- 전화
CoMarshalInterThreadInterfaceInStream
그리고 저장 IStream
멤버 필드의 포인터;
- 중요한 섹션을 남겨 두십시오.
그것을 검색하려면
- 임계 섹션을 입력하십시오.
- 전화
CoGetInterfaceAndReleaseStream
인터페이스를 검색합니다
- 전화
CoMarshalInterThreadInterfaceInStream
그리고 다시 보관하십시오 IStream
향후 사용하기 위해
- 중요한 섹션을 남겨 두십시오.
- 현재 통화 범위에서 인터페이스를 사용하십시오.
그것을 발표하려면 :
- 더 이상 보관할 필요가 없으면 저장된 저장을 해제하십시오.
IStream
(중요 섹션 내부).
"외계인"객체도 프리 스레드가 있고 동일한 프로세스 내에서 발생하는 일이 발생하면 직접 인터페이스 포인터를 다루게 될 것입니다. CoGetInterfaceAndReleaseStream
. 그러나, 당신은 어떤 가정도하지 않아야하며, 당신이 다루는 객체가 원래 객체인지 com Marshaller 프록시인지 알 필요가 없습니다.
사용하여 약간 최적화 할 수 있습니다 CoMarshalInterface
w/ MSHLFLAGS_TABLESTRONG
/ CoUnmarshalInterface
/ IStream::Seek(0, 0)
/ CoReleaseMarshalData
대신에 CoGetInterfaceAndReleaseStream
/CoGetInterfaceAndReleaseStream
, 스트림을 풀지 않고 필요한만큼 동일한 인터페이스를 마실 수 없습니다.
스레드 로컬 스토리지와 관련하여 더 복잡하고 더 효율적인 캐싱 시나리오가 가능합니다. 그러나 나는 그것이 과잉 일 것이라고 믿는다. 나는 어떤 타이밍도하지 않았지만 오버 헤드라고 생각합니다. CoMarshalInterThreadInterfaceInStream
/CoGetInterfaceAndReleaseStream
정말 낮습니다.
즉, 상태를 유지해야한다면 스레드 친화력이 필요할 수있는 모든 자원이나 개체를 저장합니다., 앞서 언급 한 COM 인터페이스 외에, 당신 해서는 안됩니다 당신의 객체를 다음과 같이 표시하십시오 ThreadingModel=Both
또는 FTM을 집계하십시오.