当前位置:  开发笔记 > 编程语言 > 正文

如何将接口指针传递给线程?

如何解决《如何将接口指针传递给线程?》经验,为你挑选了2个好方法。

注意:

使用原始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

问候



1> Quassnoi..:

如下所述,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();
}



2> Martin..:

如果您问题中的接口是COM接口,Quassnoi给出的方法可能还不够.您必须注意正在使用的COM对象的线程模型.如果辅助线程将从创建COM对象的COM单元加入单独的COM单元,并且如果该对象不是单元敏捷的,则需要封送该接口指针以使辅助线程获得代理,并且不是指向对象的直接指针.

通过使用IMarshal的特殊实现,COM对象通常是公寓敏捷的.最简单的方法是聚合Free Threaded Marshaler.

一些有用的链接......

CoMarshalInterThreadInterfaceInStream

GlobalInterfaceTable(GIT)

CoCreateFreeThreadedMarshaler的

更新:关于自由线程的Marshaler ......

从这个主题的评论中可以清楚地看出,有些人会建议你永远不要触摸FTM.虽然"有效COM"是一本很好的书,但我认为它的一些建议可以解释.第33项说"小心FTM"; 它没有说"永远不要使用FTM".非常明智地,它建议谨慎,特别是当您的公寓敏捷对象持有对其他对象的引用时,因为它们可能不是公寓敏捷的.所以真正的建议是:在构建公寓敏捷对象时要慎重考虑,无论他们是否使用FTM来实现敏捷性.如果您确定可以构建一个敏捷的公寓对象,我认为没有理由不使用FTM来实现这一目标.

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有