Thread.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. #include "stdafx.h"
  2. #include <process.h>
  3. #include "Thread.h"
  4. #ifdef _DEBUG
  5. #define new DEBUG_NEW
  6. #undef THIS_FILE
  7. static char THIS_FILE[] = __FILE__;
  8. #endif
  9. unsigned int WINAPI ThreadProc(IN LPVOID lpParam);
  10. CThreadBase::CThreadBase()
  11. {
  12. m_nIndex = -1;
  13. m_hThread = NULL;
  14. m_ThreadStatus = THREADSTATUS_STOP;
  15. m_hWakeUpSignal = NULL;
  16. m_hExitEvent = NULL;
  17. m_nThreadID = 0;
  18. for(int i=0; i<2; i++)
  19. m_hEvent[i] = NULL;
  20. }
  21. CThreadBase::~CThreadBase()
  22. {
  23. }
  24. /************************************************************************/
  25. /*
  26. 函数:Start
  27. 描述:启动线程
  28. 参数:
  29. 返回:1成功, 0失败
  30. */
  31. /************************************************************************/
  32. int CThreadBase::Start()
  33. {
  34. if(m_ThreadStatus != THREADSTATUS_STOP)
  35. return 1;
  36. if(m_hEvent[0] == NULL)
  37. {
  38. for(int i=0; i<2; i++)
  39. m_hEvent[i] = CreateEvent(NULL, FALSE, FALSE, NULL);
  40. }
  41. /*
  42. if(m_hExitEvent == NULL)
  43. m_hExitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  44. if(m_hWakeUpSignal == NULL)
  45. {
  46. m_hWakeUpSignal = CreateSemaphore(NULL, 1, 2, NULL);
  47. WaitForSingleObject(m_hWakeUpSignal, INFINITE);
  48. }
  49. */
  50. if(m_hThread == NULL)
  51. m_hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadProc, this, 0, &m_nThreadID);
  52. if(m_hThread == 0)
  53. {
  54. OutputDebugString(_T("创建线程失败\n"));
  55. return 0;
  56. }
  57. m_ThreadStatus = THREADSTATUS_WAIT;
  58. return 1;
  59. }
  60. /************************************************************************/
  61. /*
  62. 函数:Stop
  63. 描述:停止
  64. 参数:
  65. 返回:1成功,0失败
  66. */
  67. /************************************************************************/
  68. int CThreadBase::Stop()
  69. {
  70. if(m_hEvent[1])
  71. SetEvent(m_hEvent[1]);
  72. // if(m_hExitEvent)
  73. // SetEvent(m_hExitEvent);
  74. //if(m_hWakeUpSignal)
  75. // CloseHandle(m_hWakeUpSignal);
  76. //m_hWakeUpSignal = NULL;
  77. // if(m_hExitEvent)
  78. // CloseHandle(m_hExitEvent);
  79. // m_hExitEvent = NULL;
  80. return 1;
  81. }
  82. void CThreadBase::Exit()
  83. {
  84. if(m_hEvent[1])
  85. SetEvent(m_hEvent[1]);
  86. // if(m_hExitEvent)
  87. // SetEvent(m_hExitEvent);
  88. if(m_hThread)
  89. {
  90. #ifdef _DEBUG
  91. CString strMsg = _T("");
  92. strMsg.Format(_T("线程%d 等待退出\n"), m_nThreadID);
  93. OutputDebugString(strMsg);
  94. WaitForSingleObject(m_hThread, INFINITE);
  95. strMsg.Format(_T("线程%d 退出\n"), m_nThreadID);
  96. OutputDebugString(strMsg);
  97. #else
  98. WaitForSingleObject(m_hThread, INFINITE);
  99. #endif //#ifdef _DEBUG
  100. CloseHandle(m_hThread);
  101. }
  102. m_hThread = NULL;
  103. //if(m_hWakeUpSignal)
  104. // CloseHandle(m_hWakeUpSignal);
  105. //m_hWakeUpSignal = NULL;
  106. // if(m_hExitEvent)
  107. // CloseHandle(m_hExitEvent);
  108. // m_hExitEvent = NULL;
  109. for(int i=0; i<2; ++i)
  110. {
  111. CloseHandle(m_hEvent[i]);
  112. m_hEvent[i] = NULL;
  113. }
  114. }
  115. /************************************************************************/
  116. /*
  117. 函数:WakeUp
  118. 描述:唤醒
  119. 参数:
  120. 返回:1成功,0失败
  121. */
  122. /************************************************************************/
  123. void CThreadBase::WakeUp()
  124. {
  125. //重置信号
  126. // if(m_hWakeUpSignal)
  127. // ReleaseSemaphore(m_hWakeUpSignal, 1, NULL);
  128. #ifdef _DEBUG
  129. CString strMsg = _T("");
  130. strMsg.Format(_T("ID = %d 唤醒\n"), m_nThreadID);
  131. OutputDebugString(strMsg);
  132. #endif //#ifdef _DEBUG
  133. if(m_hEvent[0])
  134. SetEvent(m_hEvent[0]);
  135. }
  136. /************************************************************************/
  137. /*
  138. 函数:WorkItem
  139. 描述:工作项
  140. 参数:
  141. IN LPVOID lpParam
  142. 返回:0
  143. */
  144. /************************************************************************/
  145. unsigned int WINAPI ThreadProc(IN LPVOID lpParam)
  146. {
  147. CThreadBase* p = (CThreadBase*)lpParam;
  148. while(1)
  149. {
  150. int nSatus = p->Run();
  151. if(nSatus == THREADSTATUS_EXIT) // 线程退出
  152. {
  153. p->Close();
  154. delete p;
  155. p = NULL;
  156. break;
  157. }
  158. if(nSatus == THREADSTATUS_END) // 程序结束
  159. break;
  160. }
  161. return 0;
  162. }
  163. /************************************************************************/
  164. /*
  165. 函数:Close
  166. 描述:关闭
  167. 参数:
  168. IN LPVOID lpParam
  169. 返回:0
  170. */
  171. /************************************************************************/
  172. void CThreadBase::Close()
  173. {
  174. if(m_hThread)
  175. CloseHandle(m_hThread);
  176. m_hThread = NULL;
  177. for(int i=0; i<2; ++i)
  178. {
  179. CloseHandle(m_hEvent[i]);
  180. m_hEvent[i] = NULL;
  181. }
  182. CString strMsg = _T("");
  183. strMsg.Format(_T("id = %d 已关闭\n"), m_nThreadID);
  184. OutputDebugString(strMsg);
  185. }