본문으로 바로가기

ATL Event Thread, ATL 쓰레드 이벤트 발생 시키기

category 개발언어/c++ 2016. 7. 9. 08:24
ATL COM 객체에서  Thread를 통해서Event  발생시키기

첨부 파일을 다운로드 받아서 설치 한다
첨부된 atlcpimplmt.zip

을 다운로드 받아서  설치 한다.  위치=C:\Program Files (x86)\Microsoft Visual Studio\VC98\ATL\Include


,설치 하지 않으면 “ATLCPImplMT.h” 파일을 찾을 수 없다 는 에러가 발생 한다.

    1.이벤트 처리 루티이 들어 있는 파일을 열어서 헤더를 선언하고 ConnectionPoint 상속을 변경한다
# include “ATLCPImplMT.h”
template <class T>
class CProxy_ClassEvents : public IConnectionPointImplMT<T, &DIID__IClassEvents, CComDynamicUnkArray>

IConnectionPointImpl->IConnectionPointImplMT

   2. 이벤트를 발생 시키는 Fire_XXX 부분을 바꿔준다.
 for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++)
{
   // pT->Lock();
// CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex);
// pT->Unlock();
 
수정)
CComPtr<IUnknown> sp;
sp.Attach (GetInterfaceAt(nConnectionIndex));
…………………
3. 쓰레드 함수 구현
CoInitializeEx,   ::CoUninitialize ();  를 눈여겨 보자 thread로 이벤트를 발생시킬때
반드시 CoInitializeEx 를 실행하고 이벤트를 발생시킨다.
이벤트가 종료된 후에는  ::CoUninitialize (); 로 마무리 해야 한다.
그렇지 않으면 특성한 시점에 문제가 될 수 있다, Mutex와 같은 역활을 하므로 잊어서는 안된다’
DWORD WINAPI justDoIt(LPVOID lpParameter)
{
  // Initialize COM,
  HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
  CMyAtl *myAtl = (CMyAtl*)lpParameter;
  long result;
  for (int i = 1; i <= myAtl->m_number; ++i)
    result = i * 2;
  myAtl->Fire_XXX(result);
  ::CoUninitialize ();
  return 0;
}