描述:
此处是对如何在多线程中迸发事件方法的 总 结 ,非原创!
1.工作线程书写格式:
DWORD WINAPI Thread1(LPVOID lpPara)
{
/*!*/ HRESULT hRet = CoInitializeEx(NULL, COINIT_MULTITHREADED);
ATLASSERT(hRet == S_OK);
...
while(...)
{
...
g_pCom->Fire_Event1(...);//g_pCom即组件类 的 实例 的 全局指针
...
}
...
/*!*/ CoUninitialize ();
return 0;
}
2.从microsoft网站下载“ATLCPImplMT.h”文件(从google中搜“ATLCPImplMT.h”即得),并在*CP.h文件中#include它
3.修改*CP.h
打开*CP.h文件,把IConnectionPointImpl变成IConnectionPointImplMT,并在此文件中#include "ATLCPImplMT.h" 。
即:
#ifndef _LLCP_H_
#define _LLCP_H_
template <class T>
class CProxy_IllCtrlEvents : public IConnectionPointImpl<T, &DIID__IllCtrlEvents, CComDynamicUnkArray>
变成 ->
#ifndef _LLCP_H_
#define _LLCP_H_
#include "ATLCPImplMT.h"
template <class T>
class CProxy_IllCtrlEvents : public IConnectionPointImplMT<T, &DIID__IllCtrlEvents, CComDynamicUnkArray>
*CP.h文件还没有修改完,
再把文件中所有
pT->Lock();
CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex);
pT->Unlock();
换成 ->
CComPtr<IUnknown> sp;
sp.Attach (GetInterfaceAt(nConnectionIndex));
注意:*CP.h文件中的代码是由向导自动维护的,所以,当你“Implement Connection Point”后,还得再动手修改此文件,即重复3