EventThread.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. #include "StdAfx.h"
  2. #include "EventThread.h"
  3. #include "Misc.h"
  4. #define EXIT_EVENT -1
  5. CEventThread::CEventThread(void)
  6. {
  7. AddEvent(EXIT_EVENT);
  8. m_hEvt = CreateEvent(NULL, FALSE, FALSE, NULL);
  9. m_waitTimeout = INFINITE;
  10. m_threadRunning = false;
  11. m_exitThread = false;
  12. }
  13. CEventThread::~CEventThread(void)
  14. {
  15. Stop();
  16. for(EventMapType::iterator it = m_eventMap.begin(); it != m_eventMap.end(); it++)
  17. {
  18. CloseHandle(it->first);
  19. }
  20. }
  21. UINT CEventThread::EventThreadFnc(void* thisptr)
  22. {
  23. CEventThread *threadClass = (CEventThread*)thisptr;
  24. threadClass->RunThread();
  25. return 0;
  26. }
  27. void CEventThread::AddEvent(int eventId)
  28. {
  29. HANDLE handle = CreateEvent(NULL, FALSE, FALSE, _T(""));
  30. m_eventMap[handle] = eventId;
  31. }
  32. bool CEventThread::FireEvent(int eventId)
  33. {
  34. //Log(StrF(_T("Begin FireEvent, eventId: %d"), eventId));
  35. bool ret = false;
  36. HANDLE eventHandle = NULL;
  37. for(EventMapType::iterator it = m_eventMap.begin(); it != m_eventMap.end(); it++)
  38. {
  39. if(it->second == eventId)
  40. {
  41. eventHandle = it->first;
  42. break;
  43. }
  44. }
  45. if(eventHandle != NULL)
  46. {
  47. SetEvent(eventHandle);
  48. ret = true;
  49. }
  50. //Log(StrF(_T("End FireEvent, eventId: %d"), eventId));
  51. return false;
  52. }
  53. bool CEventThread::UndoFireEvent(int eventId)
  54. {
  55. HANDLE eventHandle = NULL;
  56. for(EventMapType::iterator it = m_eventMap.begin(); it != m_eventMap.end(); it++)
  57. {
  58. if(it->second == eventId)
  59. {
  60. eventHandle = it->first;
  61. break;
  62. }
  63. }
  64. if(eventHandle != NULL)
  65. {
  66. ResetEvent(eventHandle);
  67. return true;
  68. }
  69. return false;
  70. }
  71. void CEventThread::Start(void *param)
  72. {
  73. if(m_threadRunning == false)
  74. {
  75. ResetEvent(m_hEvt);
  76. m_exitThread = false;
  77. m_param = param;
  78. m_thread = (HANDLE)_beginthreadex(NULL, 0, EventThreadFnc, this, 0, &m_threadID);
  79. // now wait until the thread is up and really running
  80. WaitForSingleObject(m_hEvt, 1000);
  81. }
  82. else
  83. {
  84. UndoFireEvent(EXIT_EVENT);
  85. }
  86. }
  87. void CEventThread::Stop(int waitTime)
  88. {
  89. Log(_T("Start of CEventThread::Stop(int waitTime) "));
  90. if(m_threadRunning)
  91. {
  92. m_exitThread = true;
  93. FireEvent(EXIT_EVENT);
  94. if(waitTime > 0)
  95. {
  96. if (WAIT_OBJECT_0 != WaitForSingleObject(m_hEvt, waitTime))
  97. {
  98. Log(_T("Start of TerminateThread CEventThread::Stop(int waitTime) "));
  99. TerminateThread(m_thread, 0);
  100. Log(_T("End of TerminateThread CEventThread::Stop(int waitTime) "));
  101. m_threadRunning = false;
  102. }
  103. }
  104. }
  105. Log(_T("End of CEventThread::Stop(int waitTime) "));
  106. };
  107. void CEventThread::RunThread()
  108. {
  109. Log(_T("Start of CEventThread::RunThread()"));
  110. m_threadRunning = true;
  111. HANDLE *pHandleArray = new HANDLE[m_eventMap.size()];
  112. int indexPos = 0;
  113. for(EventMapType::iterator it = m_eventMap.begin(); it != m_eventMap.end(); it++)
  114. {
  115. pHandleArray[indexPos] = it->first;
  116. indexPos++;
  117. }
  118. SetEvent(m_hEvt);
  119. ResetEvent(m_hEvt);
  120. while(true)
  121. {
  122. DWORD event = WaitForMultipleObjects((DWORD)m_eventMap.size(), pHandleArray, FALSE, m_waitTimeout);
  123. if(event == WAIT_FAILED)
  124. {
  125. LPVOID lpMsgBuf = NULL;
  126. DWORD dwErr = GetLastError();
  127. FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
  128. FORMAT_MESSAGE_FROM_SYSTEM |
  129. FORMAT_MESSAGE_IGNORE_INSERTS,
  130. NULL,
  131. dwErr,
  132. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
  133. (LPTSTR) &lpMsgBuf,
  134. 0,
  135. NULL);
  136. ASSERT(!lpMsgBuf);
  137. LocalFree(lpMsgBuf);
  138. }
  139. else if(event == WAIT_TIMEOUT)
  140. {
  141. OnTimeOut(m_param);
  142. }
  143. else
  144. {
  145. HANDLE firedHandle = pHandleArray[event - WAIT_OBJECT_0];
  146. int eventId = m_eventMap[firedHandle];
  147. if(eventId == EXIT_EVENT)
  148. {
  149. SetEvent(m_hEvt);
  150. break;
  151. }
  152. else
  153. {
  154. Log(StrF(_T("Start of CEventThread::RunThread() - OnEvent %d"), eventId));
  155. OnEvent(eventId, m_param);
  156. Log(StrF(_T("End of CEventThread::RunThread() - OnEvent %d"), eventId));
  157. }
  158. }
  159. }
  160. Log(_T("End of CEventThread::RunThread()"));
  161. m_threadRunning = false;
  162. }