gpt4 book ai didi

c++ - 如何将接口(interface)指针传递给线程?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:06:55 25 4
gpt4 key购买 nike

注意:

  • 使用原始 Win32 CreateTheard() API
  • 没有 MFC
  • 接口(interface)只是一个指向虚表的指针

问题:

  • 如何将接口(interface)指针传递给线程?

插图:

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

问候

最佳答案

如下所述,在线程之间传递 COM 接口(interface)指针是不安全的。

假设您知道自己在做什么:

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

关于c++ - 如何将接口(interface)指针传递给线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/510788/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com