【发布时间】:2014-03-05 16:43:18
【问题描述】:
我可以在这样的服务的主工作线程中访问IAudioEndpointVolume 接口(省略错误检查):
CoInitialize(NULL);
CoCreateGuid(&g_guidMyContext);
CoCreateInstance(CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, (void**)&m_pEnumerator);
IMMDevice *pEndpoint = NULL;
m_pEnumerator->GetDevice(&deviceID[0], &pEndpoint);
IAudioEndpointVolume *pAudioVol = NULL;
pEndpoint->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, NULL, (void**)&pAudioVol);
CAudioEndpointVolumeCallback *pVolumeCallback = new CAudioEndpointVolumeCallback(pAudioVol, 100, TRUE, m_debugLog, m_logMutex);
然后CAudioEndpointVolumeCallback 类将IAudioEndpointVolume 指针存储在一个成员变量中,并在其构造函数中调用RegisterControlChangeNotify(this)。
这个类也可以启动一个线程来在短时间内将音量从一个值平滑地更改为另一个值。所以最后我从不同的线程调用IAudioEndpointVolume 接口。一般来说,所有这些都按预期工作,但在某些极端情况下我遇到了一些奇怪的行为。再次检查代码时,我偶然发现了 MSDN 文档中关于线程的 cmets(我之前没有任何 COM 对象的经验)并想知道我所做的是否正确。
那么,使用上面的代码从不同线程调用IAudioEndpointVolume 接口是否安全?我是否必须使用互斥锁来保护这些调用?
我有点困惑,不确定我是否真的理解behavior of the COM Threading Models。
【问题讨论】:
-
这不太可能与线程有关,因为您从获得接口指针的同一个线程进行调用。这很可能与使用服务有很大关系。你应该引用你的previous question about this。
-
我不会从获得指针的同一个线程进行(所有)调用!我对我的代码进行了一些关于线程安全的更改,这解决了我在使用此服务时遇到的其他一些问题。因此,这为我指明了导致我发布此问题的方向。稍后我会从另一个问题中尝试您的建议。实际上,我怀疑它是否会解决那里的 cmets 中发布的问题。反正我会试试的。但是,请不要将其视为个人 ;)
标签: c++ multithreading winapi com