RANDOM.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:3k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // Random.cpp : Implementation of CConnectApp and DLL registration.
  2. #include "preconn.h"
  3. #include "Connect.h"
  4. #include "Random.h"
  5. /////////////////////////////////////////////////////////////////////////////
  6. //
  7. STDMETHODIMP CRandom::InterfaceSupportsErrorInfo(REFIID riid)
  8. {
  9.     if (riid == IID_IRandom)
  10.         return S_OK;
  11.     return S_FALSE;
  12. }
  13. /////////////////////////////////////////////////////////////////////////////
  14. //
  15. DWORD WINAPI RandomSessionThreadEntry(void* pv)
  16. {
  17.     CRandom::RandomSessionData* pS = (CRandom::RandomSessionData*)pv;
  18.     CRandom* p = pS->pRandom;
  19.     while (WaitForSingleObject(pS->m_hEvent, 0) != WAIT_OBJECT_0)
  20.         p->Fire(pS->m_nID);
  21.     return 0;
  22. }
  23. CRandom::~CRandom()
  24. {
  25.     StopAll();
  26. }
  27. void CRandom::CreateRandomSession(RandomSessionData& rs)
  28. {
  29.     DWORD dwThreadID = 0;
  30.     _ASSERTE(rs.m_hEvent == NULL);
  31.     _ASSERTE(rs.m_hThread == NULL);
  32.     rs.pRandom = this;
  33.     rs.m_hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  34.     rs.m_hThread = CreateThread(NULL, 0, &RandomSessionThreadEntry, &rs, 0, &dwThreadID);
  35. }
  36. STDMETHODIMP CRandom::get_Start(long* pnID)
  37. {
  38.     if (pnID == NULL)
  39.         return E_POINTER;
  40.     *pnID = 0;
  41.     HRESULT hRes = S_OK;
  42.     m_cs.Lock();
  43.     for (long i=0;i<nMaxSessions;i++)
  44.     {
  45.         if (m_rsArray[i].m_hEvent == NULL)
  46.         {
  47.             m_rsArray[i].m_nID = i;
  48.             CreateRandomSession(m_rsArray[i]);
  49.             *pnID = i;
  50.             break;
  51.         }
  52.     }
  53.     if (i == nMaxSessions) //fell through
  54.         hRes = E_FAIL;
  55.     m_cs.Unlock();
  56.     return hRes;
  57. }
  58. STDMETHODIMP CRandom::put_Stop(long nID)
  59. {
  60.     HRESULT hRes = S_OK;
  61.     m_cs.Lock();
  62.     if (m_rsArray[nID].m_hEvent != NULL)
  63.     {
  64.         SetEvent(m_rsArray[nID].m_hEvent);
  65.         WaitForSingleObject(m_rsArray[nID].m_hThread, INFINITE);
  66.         CloseHandle(m_rsArray[nID].m_hThread);
  67.         memset(&m_rsArray[nID], 0, sizeof(RandomSessionData));
  68.     }
  69.     else
  70.         hRes = E_INVALIDARG;
  71.     m_cs.Unlock();
  72.     return hRes;
  73. }
  74. STDMETHODIMP CRandom::StopAll()
  75. {
  76.     m_cs.Lock();
  77.     for (long i=0;i<nMaxSessions;i++)
  78.     {
  79.         if (m_rsArray[i].m_hEvent != NULL)
  80.         {
  81.             SetEvent(m_rsArray[i].m_hEvent);
  82.             WaitForSingleObject(m_rsArray[i].m_hThread, INFINITE);
  83.             CloseHandle(m_rsArray[i].m_hThread);
  84.             memset(&m_rsArray[i], 0, sizeof(RandomSessionData));
  85.         }
  86.     }
  87.     m_cs.Unlock();
  88.     return S_OK;
  89. }
  90. // broadcast to all the objects
  91. HRESULT CRandom::Fire(long nID)
  92. {
  93.     IConnectionPointImpl<CRandom, &IID_IRandomEvent, CComDynamicUnkArray>* p = this;
  94.     Lock();
  95.     HRESULT hr = S_OK;
  96.     IUnknown** pp = p->m_vec.begin();
  97.     while (pp < p->m_vec.end() && hr == S_OK)
  98.     {
  99.         if (*pp != NULL)
  100.         {
  101.             IRandomEvent* pIRandomEvent = (IRandomEvent*)*pp;
  102.             hr = pIRandomEvent->put_Fire(nID);
  103.         }
  104.         pp++;
  105.     }
  106.     Unlock();
  107.     return hr;
  108. }